我的任务是为自定义查询语言编写语法,用户可以在其中编写一些基本查询。 到目前为止,我的语法是:
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将在树中创建以下子代:
我绝对是创建解析器的初学者,但是我仍然不明白为什么它会贪婪地进行匹配,直到VALUE中的字符串结束为止,当我指定找到QUOTATION后应该结束匹配时。我希望,如果在树的第一个分支中将'name1'与VALUE匹配,然后创建另一个具有EG_ApplicationFunction.Name =“ name2”的分支,则将其解析为上一个分支。
这将是我的预期结果:
答案 0 :(得分:0)
~[QUOTATION]
与Q
,U
,O
,T
,A
,T
,{ {1}},I
和O
。您需要做的是N
。
您的~["]
规则可能如下所示:
VALUE