我试图实现一个表达式处理语法(即带有嵌套括号和东西涉及)。我见到目前为止以下,但他们不能与某些情况下(成功/失败案例出现在下面的代码块之后)处理。任何人都知道这是怎么回事?

注意: VARNAME + = VARNAME = 的东西都只是一些额外AST代帮手XTEXT东西。不要担心他们现在。

...

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“是”的表达,所以它可以被表示为一个子类或的实现(如果表达是一个接口/抽象类种类的)。

其他提示

请使用^的放置的令牌/规则名称是用于定义表达式非常有用的。

    expression :    e1 (OR^ e1)* ;
    e1  :   e2 (AND^ e2)*;
    e2  :   e3 (PIPE^ e3)*;
    e3  :   e4 (ANDSYMB^ e4)*;
    e4  :   e5 ((EQUAL^|NOTEQUAL^) e5)*;
    e5  :   e6 ((LESS^|GREATER^) e6)*;
    e6  :   e7 ((PLUS^|MINUS^) e7)* ;
    e7  :   e8 ((STAR^|SLASH^) e8)* ;
    e8  :   e9 (NEW^ ID LPAREN RPAREN)*;
    e9  :   (NOT^)? e10;
    e10 :   e11 | call_def;
    e11 :   constant 
        | '(' expression ')' -> expression;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top