我正在从一些文本中将a tool写入生成序列图。我需要支持这两种语法:
anInstance:AClass.DoSomething()
和participant A -> participant B: Any character except for \r\n (<>{}?)etc.
。让我们先调用一个strict
语法和第二个free
语法。在anInstance:AClass.DoSomething()
中,我需要to
(ID ':' ID
)与strict
语法匹配。但是,:AClass.DoSomething()
将首先与CONTENT
匹配。我正在考虑某种先行,检查->
是否存在,但无法弄明白。
Strict
语法message
: to '.' signature
;
signature
: methodName '()'
;
to
: ID ':' ID
;
methodName
: ID
;
ID
: [a-zA-Z_] [a-zA-Z_0-9]*
;
Free
语法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)
;
答案 0 :(得分:1)
您需要了解ANTLR词法分析器的工作原理:
根据您当前的词法规则,CONTENT
会在遇到:
时优先,因此永远不会匹配':' ID
。
对于ANTLR 4,在这种情况下你可能应该使用模式 - 当你在自由格式中遇到:
时,切换到“免费”模式并定义词法分析器规则{ {1}}仅在“免费”模式下可用。
请参阅this question以了解ANTLR 4词法分析器模式的工作原理。