卡住了过滤语言的简单语法

时间:2013-06-19 00:35:23

标签: antlr3

我已经尝试并且接近但仍然卡住了。输入语言就像这样

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

即表格中的一组条款,由“和”或“或”加入。这可以是一个或多个条款

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

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#中运行时,我得到'多个节点作为root'

此外,我不确定如何进行N联接

0 个答案:

没有答案