标记冲突(??)写入ANTLR4语法

标记冲突(??)写入ANTLR4语法,antlr4,antlr4cs,Antlr4,Antlr4cs,我有一个我认为非常简单的语法: 我希望它允许一个叫做事实的标记。这些标记可以以字母开头,然后允许任何类型的标记:字母、数字、%或_ 我想用一个例子来说明两个事实。但第二个事实不必以字母开头(数字、%或u从第二个标记开始也是有效的) 整个事实中的任何“子行为”(甚至是初始行为)都可以像数组一样“实例化”(您可以通过阅读我的示例获得它) 例如: 福 富% 富奥12% 富吧 Foo.%Bar Foo.4_酒吧 傅[42] Foo['instance'].Bar 等 我试着写这样的语法,但没法用:

我有一个我认为非常简单的语法:

  • 我希望它允许一个叫做事实的标记。这些标记可以以字母开头,然后允许任何类型的标记:字母、数字、%或_
  • 我想用一个例子来说明两个事实。但第二个事实不必以字母开头(数字、%或u从第二个标记开始也是有效的)
  • 整个事实中的任何“子行为”(甚至是初始行为)都可以像数组一样“实例化”(您可以通过阅读我的示例获得它)
  • 例如:

    • 富%
    • 富奥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
    将与
    事实
    匹配,而不是
    数字
    。很可惜,我们不能以不同的方式处理这件事。谢谢你的链接!