解析:用于.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定义,因为我之前忘记了)

解析:用于.net的ANTLR

试试这个:

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任何在语法上对解析不重要的内容