gpt4 book ai didi

表达式的 ANTLR 文法

转载 作者:行者123 更新时间:2023-12-01 11:09:37 34 4
gpt4 key购买 nike

我正在尝试实现一个表达式处理语法(处理嵌套括号和其他内容)。到目前为止我有以下内容,但它们无法处理某些情况(成功/失败情况出现在以下代码块之后)。有人知道这是怎么回事吗?

注意:varname +=varname = 只是 XText 中一些额外的 AST 生成助手。现在不用担心它们。

...

NilExpression returns Expression:
'nil';

FalseExpression returns Expression:
'false';

TrueExpression returns Expression:
'true';

NumberExpression returns Expression:
value=Number;

StringExpression returns Expression:
value=STRING; //EllipsesExpression: '...';
//FunctionExpression: function=function; //don't allow random functions


UnaryExpression:
op=unop ('(' expr=Expression ')')|expr=Expression;

BinaryExpression:
'or'? AndOp; //or op

AndOp:
'and'? ComparisonOp;

ComparisonOp:
('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;

ConcatOp:
'..'? AddSubOp;

AddSubOp:
('+' '-')? MultDivOp;

MultDivOp:
('*' '/')? ExpOp;

ExpOp:
'^'? (('(' expr=Expression ')')|expr=Expression);

ExprSideOne : Variable|NilExpression|FalseExpression|TrueExpression|
NumberExpression|StringExpression|UnaryExpression;

Expression:
(
'('
expression1=ExprSideOne expression2+=BinaryExpression*
')'
)
|
( expression1=ExprSideOne expression2+=BinaryExpression* )
;
...

这是解析/失败的列表:

c = ((b)); //fails
c = ((a not b)); //fails
c = b; //parses
d = (b); //parses

最佳答案

发生的事情是您的表达式/表达式支持单括号而不是多括号(正如您总结的那样)。我没有 ANTLR 的特定经验,但我使用过 Javacc,它有许多相似的概念(我为 Prolog 写了一个语法......不要问)。

要处理嵌套的括号,您通常会使用类似于:

ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';

这意味着表达式要么被括在括号中,要么只是一个原始表达式。至于 AST 如何处理这个问题,ParenthesisExpression"is"表达式,因此它可以表示为子类或实现(如果 Expression 是某种接口(interface)/抽象类)。

关于表达式的 ANTLR 文法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1452729/

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