我正在尝试编写antlr语法,以便我可以在某个ID上创建匹配。
我需要匹配以字符'n'开头并以'd'结尾的字符 这个ID可以有空间。 我想在其他任何地方忽略空白
// lexer/terminal rules start with an upper case letter
ID
:
(
'a'..'z'
| 'A'..'Z'
| '0'..'9'
| ('+'|'-'|'*'|'/'|'_')
| '='
| '~'
| '{'
| '}'
| ','
| NA
)+
;
NA : 'n'[ ]['a'..'z']'d' ;
WS : [ \t\n]+ -> skip;
我用表达式A1 =未尝试
测试了这个它认为A1 =不作为ID并尝试作为错误节点
你是否有一个忽略空格的语法,但是对某个字符串的例外是“未尝试”
答案 0 :(得分:0)
你应该尝试从其余部分中分离ID ("A1")
。此外,您需要注意词法规则的优先级。你的“n ... d”应该有更高的优先级,所以把它作为你的第一个词法规则之一。
工作语法(仅针对您的示例测试“A1 =未尝试”是:
statement : ID expr;
expr : OP expr
| (NA | ID | OP)
;
NA : 'n'[a-zA-Z ]*'d' ;
ID
: (
'a'..'z'
| 'A'..'Z'
| '0'..'9'
| ('+'|'-'|'*'|'/'|'_')
)+ ;
OP : '='
| '~'
| '{'
| '}'
| ','
;
WS : [ \t\r\n]+ -> skip;
尝试启动规则statement
。我更改了NA规则,因此它将按任意顺序匹配零个或多个字符a到z和A到Z和Whitspace。
运气好的ANTLR,它是一个不错的工具。