gpt4 book ai didi

antlr - 如何解决这种有歧义的语法?

转载 作者:行者123 更新时间:2023-12-01 10:07:06 24 4
gpt4 key购买 nike

我写了这个语法:

expr        : multExpr ( ('+' | '-') multExpr )*;
multExpr : atom ( ('*' | '/') atom )*;
atom : INT | FLOAT | ID | '(' expr ')';
condition : cond ('or' cond)*;
cond : c1 ('and' c1)*;
c1 : ('not')? c2;
c2 : '(' condition ')' | boolean;
boolean : expr (relop expr | ²) | 'true' | 'false';
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';

很明显,我省略了 INT、FLOAT、ID 的词法分析器规则。

问题是c2规则,因为'('而有歧义,我找不到解决方案,你能给我一个解决方案吗?

最佳答案

为什么不简单地做:

expr      : orExpr; 
orExpr : andExpr ('or' andExpr)*;
andExpr : relExpr ('and' relExpr)*;
relExpr : addExpr (relop addExpr)?;
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';
addExpr : multExpr (('+' | '-') multExpr)*;
multExpr : unaryExpr (('*' | '/') unaryExpr)*;
unaryExpr : 'not'? atom;
atom : INT | FLOAT | ID | 'true' | 'false' | '(' expr ')';

一元 not 通常具有比您现在尝试的更高的优先级。

这将允许像 42 > true 这样的表达式,但是在遍历 AST/树时可能会检查这样的语义。

编辑

输入 "not(a+b >= 2 * foo/3.14159) == false" 现在将像这样解析(忽略空格):

enter image description here

如果您将输出设置为 AST 并混合一些树重写运算符(^!):

options {
output=AST;
}

// ...

expr : orExpr;
orExpr : andExpr ('or'^ andExpr)*;
andExpr : relExpr ('and'^ relExpr)*;
relExpr : addExpr (relop^ addExpr)?;
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';
addExpr : multExpr (('+' | '-')^ multExpr)*;
multExpr : unaryExpr (('*' | '/')^ unaryExpr)*;
unaryExpr : 'not'^ atom | atom;
atom : INT | FLOAT | ID | 'true' | 'false' | '('! expr ')'!;

你会得到:

enter image description here

关于antlr - 如何解决这种有歧义的语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com