解析字符“ ANTLR4

时间:2019-09-18 09:37:40

标签: parsing antlr4

我的任务是为自定义查询语言编写语法,用户可以在其中编写一些基本查询。 到目前为止,我的语法是:

grammar                 EAQL;

prog:                   cond;

cond:                   cond logical_operator cond | elexpr comparison_operator  VALUE;

elexpr:                 ELSTEREOTYPE '.' eattribute;

conexpr:                CSTEREOTYPE '.' cattribute;

eattribute:             'Name' | 'Path' | 'GUID' | conexpr;

cattribute:             'Name' | 'GUID' | elexpr;

VALUE:                   QUOTATION ( ~([QUOTATION]) | ~('\n'))+ QUOTATION;

ELSTEREOTYPE:           'EG_ApplicationComponent' | 'EG_ApplicationFunction';

CSTEREOTYPE:            'EG_Flow';

SPACE:                  ' ';

QUOTATION:              '"';

EOL:                    '\n';

WS : (' ' | '\t')+ -> channel(HIDDEN);

AND:                    'AND';

OR:                     'OR';

logical_operator:       AND | OR;

EQUALS:                 '=';

GREATER_THAN:           '>';

SMALLER_THAN:           '<';

comparison_operator:    GREATER_THAN | SMALLER_THAN | EQUALS;

当我尝试解析此字符串时

  

EG_ApplicationComponent.Name =“” name1“和EG_ApplicationFunction.Name =” name2“

ANTLR将在树中创建以下子代:

  1. 'EG_ApplicationComponent'
  2. '。'
  3. “姓名”
  4. '='
  5. '“ name1” AND EG_ApplicationFunction.Name =“” name2“'

我绝对是创建解析器的初学者,但是我仍然不明白为什么它会贪婪地进行匹配,直到VALUE中的字符串结束为止,当我指定找到QUOTATION后应该结束匹配时。我希望,如果在树的第一个分支中将'name1'与VALUE匹配,然后创建另一个具有EG_ApplicationFunction.Name =“ name2”的分支,则将其解析为上一个分支。

这将是我的预期结果:

  1. 'EG_ApplicationComponent'
  2. '。'
  3. “姓名”
  4. '='
  5. '“ name1”'
  6. AND
  7. EG_ApplicationFunction
  8. '。'
  9. “姓名”
  10. '='
  11. '“ name2”'

1 个答案:

答案 0 :(得分:0)

~[QUOTATION]QUOTAT,{ {1}},IO。您需要做的是N

您的~["]规则可能如下所示:

VALUE