antlr可以忽略一些关键字吗?

ki1q1bka  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(377)

我是antlr的新手,但我正在尝试改变我现有项目中的一些语法。语法示例如下

...

factor 
    : ava | NOT^ factor | (LPAREN! expr RPAREN!) ;

ava
    : key=ALPHANUM EQUALS value=ALPHANUM ;

AND     
    : ('and' | 'AND');

OR  
    : ('or' | 'OR'); 

NOT
    : ('not' | 'NOT');  

ALPHANUM 
    : (ALPHA | DIGIT | LIMITED_SYMBOLS)+ ;

WHITESPACE 
    : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;

fragment ALPHA 
        : ('a'..'z' | 'A'..'Z') ;

fragment DIGIT 
    : '0'..'9' ;

fragment LIMITED_SYMBOLS
    : ('.' | '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '-' | '_' | '+' | '~' | ':' | '/' | '?' | '|');

语法应该解析这样的东西 a=10 AND s=1 AND s=2 或者 ((a=9 AND s=1) AND s=2) .
问题是有没有可能忽略任何不存在的东西 s={ANYTHING} . 从上面的例子来看。ast将减少到 s=1 AND s=2 , ((s=1) AND s=2) 仅仅改变语法就能做到这一点吗?

xytpbqjk

xytpbqjk1#

仅仅改变语法就能做到这一点吗?
不。
当然,树重写是有可能的,但是它需要在语法中嵌入大量特定于目标的代码。最好的解决方案是只解析整个输入,然后遍历ast并丢弃以 s (普通代码)。

相关问题