如果它没有回溯以及如何禁用令牌突出显示,如何处理Xtext词法分析器?

时间:2015-08-05 21:32:47

标签: antlr3 xtext lexer backtracking

我的RQL语法适合我的工作,它与Oracle语法不同。主要区别在于字符串文字不包含双引号。

Model:
    operands+=HoOperand ( (','|'&') HoOperand )*
;

And: '&' HoOperand;
Or: (';'|'|') HoOperand;

HoOperand:
    WSP* ( HigherOrderCall | Comparison ) WSP*
;

HigherOrderCall:
    LogicalOpAliases WSP* '(' ( HoOperand ( ',' HoOperand )* ) ')'
;

CompOps : ('!='|'='|'<'|'<='|'>'|'>=');
Comparison : Strval WSP* ( CompOps ) Strval;

Nchar: (ALPHA|DIGIT|'-'|'.'|'_'|'~'|'$'|':'|'*'|'+'|'?'|'/'|'@');
Pct_encoded: '%' XDIGIT XDIGIT;    
Strval:    (Nchar|Pct_encoded)+;
LogicalOpAliases: ('or'|'and'|'not');

terminal DIGIT:    ('0'..'9');
terminal XDIGIT: (DIGIT|'A'..'F');        
terminal ALPHA:    ('A'..'Z'|'a'..'z');
terminal WSP: (' '|'\t');

我遇到了这样的问题:由于前面注意到or=aor(a=a)之类的条目与不同的规则匹配,因此第一个匹配Comparison而第二个匹配{{1 }}。因此,在这些规则中,第一个HigherOrderCall匹配or,第二个匹配Strval,它们是不同的终端,我需要词法分析器来回溯。

我已经阅读了similar question及其答案。我尝试在LogicalOpAliases中加入LogicalOpAliases,它部分地解决了这个问题(Strval这样的条目被认为是错误的,因为词法分析者贪婪,它试图消耗anf=a和不回溯)。

如何解决此问题?

第二个问题是突出显示。在条目and中,or=匹配字符串文字or。我试图制定规则or终端规则,但突出显示完全消失了。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

基本上,你必须修复你的语法。

Xtext语法不仅仅是解析器规范,还用于推断AST的类。您必须在适当的位置使用assigned actions,并了解直接规则调用(如And: '&' HoOperand;)对推断的类层次结构的影响(编写语法的方式,HoOperand将是AndOr)的子类。

此外,通过使用WSPhidden(WSP)定义为隐藏令牌而不是将其包含在允许空格的每个位置来减少混乱是有意义的。