Я работаю над этой проблемой около 4 часов. Вот мой файл грамматики ANTLR V4, который я сократил, чтобы быть самым простым из возможных.
grammar Cfscript;
component
: (statement)*
;
statement
: 'return' expression? ';'
| statementExpression ';'
;
statementExpression
: expression
;
expression
: primary
| expression '.' Identifier
;
primary
: Identifier
;
Identifier
: [a-zA-Z0-9_]+
;
WS
: [ \t\r\n]+ -> skip
;
Мой файл содержит
local.return;
Когда я пытаюсь разобрать этот файл, введя component
, я получаю следующую ошибку: mismatched input 'return' expecting Identifier
. Я не могу понять, почему возникает эта ошибка.
Обновить
Если я правильно понимаю, это потому, что return
- зарезервированное слово в Java, и именно поэтому они структурировали свою грамматику таким образом. На моем языке, Coldfusion Cfscript, return
действителен до тех пор, пока имеет область видимости: local.return
, variables.return
, local["return"]
. Это также верно для if
, else
, savecontent
и многих других слов, все из которых действительны только в пределах области видимости, но не в качестве первого члена переменной или выражения: if.blah = "something"
недопустимо, но blah.if = "something"
допустимо. Это означает, что я столкнусь с той же проблемой с каждым из этих терминов, поскольку они будут конфликтовать с правилом синтаксического анализатора, которое их захватывает.
Обобщая то, что сказал Барт, является ли это чистым способом решения этой проблемы?
grammar Cfscript;
component
: (statement)*
;
statement
: K_Return expression? ';'
| expression ';'
;
expression
: primary
| expression '.' secondary
;
primary
: Identifier
;
secondary
: K_Return
| K_If
| K_Else
| Identifier
;
K_Return : 'return' ;
K_If : 'if' ;
K_Else : 'else' ;
Identifier
: [a-zA-Z0-9_]+
;
WS
: [ \t\r\n]+ -> skip
;