标记冲突(??)写入ANTLR4语法
我有一个我认为非常简单的语法:标记冲突(??)写入ANTLR4语法,antlr4,antlr4cs,Antlr4,Antlr4cs,我有一个我认为非常简单的语法: 我希望它允许一个叫做事实的标记。这些标记可以以字母开头,然后允许任何类型的标记:字母、数字、%或_ 我想用一个例子来说明两个事实。但第二个事实不必以字母开头(数字、%或u从第二个标记开始也是有效的) 整个事实中的任何“子行为”(甚至是初始行为)都可以像数组一样“实例化”(您可以通过阅读我的示例获得它) 例如: 福 富% 富奥12% 富吧 Foo.%Bar Foo.4_酒吧 傅[42] Foo['instance'].Bar 等 我试着写这样的语法,但没法用:
- 福
- 富%
- 富奥12%
- 富吧
- Foo.%Bar
- Foo.4_酒吧
- 傅[42]
- Foo['instance'].Bar
- 等
grammar Common;
/*
* Parser Rules
*/
fact: INITIALFACT instance? ('.' SUBFACT instance?)*;
instance: '[' (LITERAL | NUMERIC) (',' (LITERAL | NUMERIC))* ']';
/*
* Lexer Rules
*/
INITIALFACT: [a-zA-Z][a-zA-Z0-9%_]*;
SUBFACT: [a-zA-Z%_]+;
ASSIGN: ':=';
LITERAL: ('\'' .*? '\'') | ('"' .*? '"');
NUMERIC: ([1-9][0-9]*)?[0-9]('.'[0-9]+)?;
WS: [ \t\r\n]+ -> skip;
例如,如果我试图解析Foo.Bar
,我会得到:语法错误第1行位置4:不匹配的输入“Bar”需要子动作
我认为这是因为ANTLR首先找到Bar
match INITIALFACT并在这里停止。我怎样才能解决这个问题
如果相关,我将使用。您的结论。只要在任何地方使用一个FACT
lexer规则,并在后处理步骤中检查命名是否正确。您是否有机会将Bar
定义为关键字?@MikeLischke否。无论我尝试了什么子行为名称,它失败了,也出现了同样的错误。@Lucastzesniewski照你说的做修复了我的问题,但首先迫使我移动数字lexer规则。否则,在事实[1]
中,1
将与事实
匹配,而不是数字
。很可惜,我们不能以不同的方式处理这件事。谢谢你的链接!你的结论。只要在任何地方使用一个FACT
lexer规则,并在后处理步骤中检查命名是否正确。您是否有机会将Bar
定义为关键字?@MikeLischke否。无论我尝试了什么子行为名称,它失败了,也出现了同样的错误。@Lucastzesniewski照你说的做修复了我的问题,但首先迫使我移动数字lexer规则。否则,在事实[1]
中,1
将与事实
匹配,而不是数字
。很可惜,我们不能以不同的方式处理这件事。谢谢你的链接!