我在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个无关输入'test'期待';'
但是,当我将语法改为
时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中哪里错了?
答案 0 :(得分:0)
在INT
之后的第一个语法REAL
和ID
规则中,字符串“INT”和“REAL”与ID
规则匹配。在你的第二个语法中,你使用字符串,它(在你喜欢的混合语法中)创建隐式词法分析器规则,优先于显式规则。
修复第一个语法移动INT
和REAL
以上ID
规则。