我在ANTLR4中有以下语法
grammar DEF;
def
:
'DEF' vartypes ID ';'
;
ID
:
(
'A' .. 'Z'|'a'..'z'
)+
;
vartypes
:
INT
| REAL
;
INT:'INT';
REAL:'REAL';
VARIABLE
:
(
'A' .. 'Z'
| 'a' .. 'z'
| '0' .. '9'
| '_'
| '-'
)+
;
fragment VARTYPEREAL
:
'REAL'
;
fragment VARTYPEINT
:
'INT'
;
LINENUMBER
:
'N' INTVALUE
;
INTVALUE
:
(
'-'
)?
(
'0' .. '9'
)+
;
WS
:
(
' '
| 't'
| 'n'
| 'r'
)+ -> skip
;
当我解析字符串"DEF REAL test"时;我收到以下错误:
line 1:4 missing {'INT', 'REAL'} at 'REAL'
第 1:9 行无关的输入"测试"期望";"
但是,当我将语法更改为
grammar DEF;
def
:
'DEF' vartypes ID ';'
;
ID
:
(
'A' .. 'Z'|'a'..'z'
)+
;
vartypes
:
'INT'
| 'REAL'
;
VARIABLE
:
(
'A' .. 'Z'
| 'a' .. 'z'
| '0' .. '9'
| '_'
| '-'
)+
;
fragment VARTYPEREAL
:
'REAL'
;
fragment VARTYPEINT
:
'INT'
;
LINENUMBER
:
'N' INTVALUE
;
INTVALUE
:
(
'-'
)?
(
'0' .. '9'
)+
;
WS
:
(
' '
| 't'
| 'n'
| 'r'
)+ -> skip
;
一切都很好。我在语法 1 中错在哪里?
在你的
第一个语法中,INT
和REAL
规则在ID
之后,所以字符串"INT"和"REAL"与ID
规则匹配。在第二个语法中,你改用字符串,它(在混合语法中)创建优先于显式规则的隐式词法分析器规则。
要修复第一个语法,请将INT
和REAL
移到规则之上ID
。