Syntax 如何消除此语法中的歧义(antlr4)

Syntax 如何消除此语法中的歧义(antlr4),syntax,antlr,Syntax,Antlr,我写的是从一些文本生成序列图。我需要支持这两种语法: a立场:AClass.DoSomething()和 参与者A->参与者B:除({}?)等之外的任何字符。 让我们把第一个称为严格语法,第二个称为自由语法。在anInstance:AClass.DoSomething()中,我需要将它与匹配到(ID':“ID),就像严格的语法一样。但是,:AClass.DoSomething()将首先由内容匹配。我在想一些前瞻性的事情,检查->是否存在,但无法找出答案 Strict语法 Free语法 您需要了解

我写的是从一些文本生成序列图。我需要支持这两种语法:

  • a立场:AClass.DoSomething()
  • 参与者A->参与者B:除({}?)等之外的任何字符。
  • 让我们把第一个称为严格语法,第二个称为自由语法。在
    anInstance:AClass.DoSomething()
    中,我需要将它与
    匹配到
    ID':“ID
    ),就像
    严格的语法一样。但是,
    :AClass.DoSomething()
    将首先由
    内容匹配。我在想一些前瞻性的事情,检查
    ->
    是否存在,但无法找出答案

    Strict
    语法
    Free
    语法
    您需要了解ANTLR lexer的工作原理:

    • 它使用与输入最长部分匹配的规则(从当前位置开始)
    • 如果多个规则可以匹配相同的输入(即相同的长度),则使用第一个规则(按照它们在中的定义顺序)
    根据您当前的lexer规则,
    内容
    在遇到
    时优先,因此
    :“ID
    将永远不会匹配

    对于ANTLR 4,在这种情况下您可能应该使用模式-当您遇到自由形式的
    时,切换到“自由”模式,并定义一个lexer规则
    内容
    仅在“自由”模式下可用

    有关ANTLR 4 lexer模式如何工作的信息,请参阅

    message
     : to '.' signature
     ;
    signature
     : methodName '()'
     ;
    to
     : ID ':' ID
     ;
    methodName
     : ID
     ;
    
    ID
     : [a-zA-Z_] [a-zA-Z_0-9]*
     ;
    
    asyncMessage
     : source '->' target content
     ;
    source
     : ID+
     ;
    target
     : ID+
     ;
    content
     : CONTENT
     ;
    
    ID
     : [a-zA-Z_] [a-zA-Z_0-9]*
     ;
    CONTENT
     : ':' ~[\r\n]+
     ;
    SPACE
     : [ \t\r\n] -> channel(HIDDEN)
     ;