0

我已经尝试过接近但一直卡住。输入语言是这样的

('aaa' eq '42') and ('bbb' gt 'zzz') or (....) and (....)

即一组由'and'或'or'连接的left op right形式的子句。可以有 1 个或多个子句

这对我来说似乎很简单,但我确信我已经开始变得太复杂了

grammar filter;

options {
    language=CSharp2;
      output=AST;
}

 tokens {
  ROOT;

  }
  OPEN_PAREN
    :   '(';
  CLOSE_PAREN
    :   ')';
  SINGLE_QUOTE
    :   '\'' ;
  AND   :   'and';
  OR    :   'or';
  GT    :   'gt';
  GE    :   'ge';
  EQ    :   'eq';
  LT    :   'lt';
  LE    :   'le';

fragment
ID   : ('a'..'z' | 'A'..'Z'  )+;
STRING  :   SINGLE_QUOTE ID SINGLE_QUOTE;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = Hidden; } ;

//public root   :    filter -> ^(ROOT filter);

public filter
    : clause^
    | lc=clause join rc=clause ->^(join $lc $rc)
    ;

left    :    STRING;
right   :   STRING; 
clause
    : OPEN_PAREN left  op   right CLOSE_PAREN //-> ^(op left right)
    ;

join    : AND 
    | OR
    ;

op  : GT|GE|LT|LE|EQ;

当我在 C# 中运行它时,我得到“多个节点作为根”

我也不确定如何进行 N 连接

4

0 回答 0