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)
;