Парсер CUP возвращает синтаксическую ошибку для действительного ввода

77
5

Я пытаюсь написать очень простой парсер. Я использую JFlex с Java CUP. Вот мой код:

Файл LEX:

import java_cup.runtime.*;

%%

%class Lexer
%line
%column
%cup

%{
/*********************************************************************************/
/* Create a new java_cup.runtime.Symbol with information about the current token */
/*********************************************************************************/
private Symbol symbol(int type) {return new Symbol(type, yyline, yycolumn);}
private Symbol symbol(int type, Object value) {return new Symbol(type, yyline, yycolumn, value);}

%}

%%

<YYINITIAL> {
<<EOF>> { return symbol(sym.EOF); }
"|" { return symbol(sym.PIPE); }

}

Файл CUP:

import java_cup.runtime.*;

terminal PIPE;

non terminal myrule;

myrule ::= PIPE {: RESULT = 42; :};

Main.java

import java.io.FileReader;

public class Main {

public static void main(String[] args) throws Exception {
CUP_FILECup parser = new CUP_FILECup(new Lexer(new FileReader(args[0])));
parser.debug_parse();
}

}

Как вы можете видеть, я попытался сделать все как можно проще, я получаю следующую ошибку для входного файла, содержащего только один символ: "|".

Синтаксическая ошибка при значении 0 ввода

Но ясно, что мы определили правильный вывод для "|".

Почему это происходит?

РЕДАКТИРОВАТЬ:
- "начать с myrule"; не помогает

спросил(а) 2021-01-19T15:36:28+03:00 6 месяцев назад
1
Решение
78

Не могли бы вы попробовать FileInputStream вместо FileReader?

(Если это работает, вы можете взглянуть на qaru.site/questions/168283/...)

И сначала вы можете попробовать только лексер.

ответил(а) 2021-01-19T15:36:28+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема