在跳过空格的同时将单个单词解析为多个标记

时间:2018-10-25 18:23:49

标签: antlr4

我的语言中空格很小,因此我跳过了它。这是我到目前为止的语法的子集:

start: expr <EOF>;
expr
    : atom
    | expr '|' expr
    | expr expr+
    | '{' expr '}'
    ;
atom
    : ATOM_TOKEN
    ;
fragment LETTER: [a-zA-Z];
fragment DIGIT: [0-9];
ATOM_TOKEN: (LETTER | DIGIT)+;
WS: [ \r\n\t]+ -> skip;

在以下输入上执行(请注意空白和缺少空白)时,它会正确生成所需的预期分析树:

{hello42   |  hi world}|{good bye} red blue green

Parse Tree

现在,我的问题是,理想情况下,我想将atom设为嵌套规则,以便挑选出具有代表性的作品。

这是一个示例语法:

atom: atomToken+;
atomToken
    : LETTERS
    | DIGITS
    ;
LETTERS: LETTER+;
DIGITS: DIGIT+;

以及通过它运行he11o的结果(注意1代替L):

Atom Parse Tree

这种方法的问题在于,由于忽略了空格,因此he11o world之类的东西现在将解析为单个atom

有什么明显的我想念的东西吗?根据我的研究,有两种可能性。

  1. 当我实际上需要提取atom的片段时,写一个辅助语法。这似乎是最简单的解决方案。
  2. 通过将生成的Lexer子类化,实现某种形式的令牌注入。这似乎很hacky,除非没有更好的选择,否则我想避免这种情况。
  3. 使用词法模式或通道执行某些操作,以便仅有条件地跳过空格吗?我很确定这不会起作用,因为触发它的上下文将来自解析器,据我所知,您无法从解析器规则中更改词法分析器的行为。
  4. 不要跳过空格,而是将主要语法与所有可能出现的空格一起扔掉。

感谢您的帮助。

0 个答案:

没有答案