解析:用于.net的ANTLR
本文关键字:ANTLR net 用于 解析 | 更新日期: 2023-09-27 17:53:49
我正在尝试解析以下文本:
<<! notes, Test!>>
语法:grammar Hello;
prog: stat+;
stat: DELIMETER_OPEN expr DELIMETER_CLOSE ;
expr: NOTES value=VAR_VALUE # delim_body ;
VAR_VALUE : [ a-Z A-Z 0-9 ! ];
NOTES : 'notes,'
| ' notes,';
DELIMETER_OPEN : '<<!';
DELIMETER_CLOSE : '!>>';
错误:line 1:12 token recognition error at: '>'
line 1:13 token recognition error at: '>'
line 1:10 mismatched input ' !' expecting VAR_VALUE
(注意:添加了DELIMITER定义,因为我之前忘记了)
试试这个:
grammar Hello;
prog : stat+ EOF ;
stat : DELIMETER_OPEN expr DELIMETER_CLOSE ;
expr : NOTES COMMA value=VAR_VALUE # delim_body ;
VAR_VALUE : ANBang* AlphaNum ;
NOTES : 'notes' ;
COMMA : ',' ;
WS : [ 't'r'n]+ -> skip ;
DELIMETER_OPEN : '<<!';
DELIMETER_CLOSE : '!>>';
fragment ANBang : AlphaNum | Bang ;
fragment AlphaNum : [a-zA-Z0-9] ;
fragment Bang : '!' ;
理想情况下,规则必须是相互明确的。因此,定义VAR_VALUE
规则是为了从最后限制!
的存在。这将防止!
被VAR_VALUE
优先于DELIMITER_CLOSE
消耗。当然,这是假设重新定义是可以接受的。如果没有,则需要更复杂的解决方案。
同样,作为一般原则,skip
任何在语法上对解析不重要的内容