нет жизнеспособной альтернативы на входе ANTLR4? - PullRequest
2 голосов
/ 09 мая 2020

Я создаю свой собственный язык с ANTLR 4, и я хотел бы создать правило для определения переменных, например, с их типами.

string = "string"
boolean = true
integer = 123
double = 12.3
string = string // reference to variable

Вот моя грамматика.

// lexer grammar
fragment LETTER : [A-Za-z];
fragment DIGIT : [0-9];
ID : LETTER+; 
STRING : '"' ( ~ '"' )* '"' ; 
BOOLEAN: ( 'true' | 'fase');
INTEGER: DIGIT+ ;
DOUBLE: DIGIT+ ('.' DIGIT+)*;
// parser grammar
program: main EOF;
main: study ;
study : studyBlock (assignVariableBlock)? ;
simpleAssign: name = ID  '=' value = (STRING | BOOLEAN | INTEGER | BOOLEAN | ID);
listAssign: name = ID  '=' value = listString #listStringAssign;
assign: simpleAssign       #simpleVariableAssign
      | listAssign         #listOfVariableAssign
      ;
assignVariableBlock: assign+;
key: name = ID '[' value = STRING ']';
listString: '{' STRING (',' STRING)* '}';
studyParameters: (| ( simpleAssign (',' simpleAssign)*) );
studyBlock: 'study' '(' studyParameters  ')' ;

Когда я тестирую этот пример, ANTLR отображает следующую ошибку:

study(timestamp = "10:30", region = "region", businessDate="2020-03-05", processType="ID")
bool = true
region = "region"
region = region
line 4:7 no viable alternative at input 'bool=true'
line 6:9 no viable alternative at input 'region=region'

Как я могу это исправить?.

1 Ответ

2 голосов
/ 09 мая 2020

Когда я проверяю вашу грамматику и начинаю с правила program для данного ввода, я получаю следующее дерево синтаксического анализа (без каких-либо ошибок или предупреждений):

enter image description here

Вы либо не начинаете с правильного правила синтаксического анализатора, либо тестируете старый синтаксический анализатор, и вам необходимо сгенерировать новые классы из вашей грамматики.

...