我试图在ANTLR中创建一个语法,如下所示。
grammar EPL2;
standard_rule:
'STANDARD' 'RULE' ':'
'FILTER' SCRIPT
'SINK' SCRIPT;
SCRIPT
: '{' SCRIPT_ATOM* '}'
;
fragment SCRIPT_ATOM
: ~[{}]
| '"' ( ~('"') )* '"'
| '//' ~[\r\n]*
| SCRIPT
;
MultiLineComment
: '/*' .*? '*/' -> channel(HIDDEN)
;
SingleLineComment
: '//' ~[\r\n\u2028\u2029]* -> channel(HIDDEN)
;
SPACES
: [ \u000B\t\r\n] -> channel(HIDDEN)
;
当我针对以下输入运行语法时:
STANDARD RULE:
FILTER { data.get("abc") == "a"; }
SINK { data.get("xyz") > 10 ;}
我收到此错误: 第3:36行不匹配的输入''期待' SINK'
我使用IntelliJ插件可视化解析树和层次结构。我可以看到第二个SCRIPT附加到第一个SCRIPT,如下图所示。
当我关闭括号(})时,解析器应该前进到sink子句,但这不会发生。
如果我在第二个字符串中添加一个打开或关闭括号(" {a")s second 脚本正确显示。
我不知道我做错了什么,有什么线索吗?