xtext语法可以匹配除某些关键字之外的所有ID吗?

时间:2013-09-16 22:41:16

标签: xtext

xtext lexer可以发出无法识别为特殊标记的内容吗?像

terminal USE: 'use';
terminal SELECT: 'select';
terminal OTHER_KEYWORDS: /* not 'use' nor 'select' */;

我写的语法就像

terminal fragment A: 'a' | 'A';
    ...
terminal fragment Z: 'z' | 'Z';

terminal fragment LETTER: 'a'..'z' | 'A'..'Z';

terminal fragment A_: 'b'..'z' | 'B'..'Z';
      ...
terminal fragment Z_: 'a'..'y' | 'A'..'Y';

terminal fragment SU_: 'a'..'r' | 't' | 'v'..'z' | 'A'..'R' | 'T' | 'V'..'Z';

terminal OTHER_KEYWORDS:
  SU_ LETTER* |

  U S_ LETTER* |
  U S E_ LETTER* |

  S E_ LETTER* |
  S E L_ LETTER* |
  S E L E_ LETTER* |
  S E L E C_ LETTER* |
  S E L E C T_ LETTER*
;

我想这样做的原因是因为antlr会在那种拼写错误中失败并且在此之后所有解析都失败了。如果有另一个可以避免解析失败,那么我不需要使用这个容易出错的错误,并且看起来很愚蠢。

1 个答案:

答案 0 :(得分:1)

我发现只使用ID来消耗输入流中的其他垃圾就可以了。

terminal USE: 'use';
terminal SELECT: 'select';
       ...
terminal TYPO: ID;

因此,如果我有us eus将被解析为ID;如果我有use,则use将被解析为USE。终端令牌的顺序很重要。