Antlr 可以忽略某些关键字吗?
Can Antlr ignore some of the keyword?
我是 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)
这甚至可以通过更改语法来实现吗?
Is this even possible by just changing the grammar?
没有
可以肯定的是,树重写是有可能的,但它会涉及将大量特定于目标的代码嵌入到您的语法中。最好的解决方案是只解析整个输入,然后遍历 AST 并丢弃某些以 s
开头的子树(在纯代码中)。
我是 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)
这甚至可以通过更改语法来实现吗?
Is this even possible by just changing the grammar?
没有
可以肯定的是,树重写是有可能的,但它会涉及将大量特定于目标的代码嵌入到您的语法中。最好的解决方案是只解析整个输入,然后遍历 AST 并丢弃某些以 s
开头的子树(在纯代码中)。