ANTLR Lexer 规则 - 根据行首的内容输入 pushMode

ANTLR Lexer rules - enter a pushMode based on what is in the beginning of line

是否可以根据文本行的开始方式在词法分析器中输入模式?这是我正在解析的源代码:

1. Top Level item 
  1. Second level item #1
  2. Second level item #2

因此,如果行以数字开头,后跟句点,我希望它进入 TOP_LEVEL 模式。但是,如果它以两个空格开头,然后是数字后跟一个句点,那么我希望它进入 SECOND_LEVEL 模式:

lexer grammar MyLexer;

TOP_LEVEL_ANCHOR: DIGIT+ PERIOD SPACE? ->pushMode(TOP_LEVEL);
SECOND_LEVEL_ANCHOR: SPACE SPACE DIGIT+ PERIOD SPACE ->pushMode(SECOND_LEVEL);

然而它总是捕捉到 TOP_LEVEL_ANCHOR。我是不是在搞乱空白的东西?我在词法分析器中没有类似 -> skip 或 hidden channel 之类的东西。剩下的:

 PERIOD: '.';
 SPACE: ' ';
 NL: '\r'? '\n';
 NON_QUOTED_STRING: [^a-zA-Z0-9] ~('\n' | '\r' | ',' )* ;
 DOUBLE_QUOTED_STRING: '"' ~('\'|'"')* '"' ;

源文档将有更多风格,以行开头的模式区分,所以想确保我在正确的方向上进行挖掘。是这样吗?

根据给定的输入,模式不太可能是正确使用的功能。模式通常用于根据上下文区分其他不明确的字符序列——您知道,当您进入一种模式时,所有其他模式(包括默认模式)中的词法分析器规则实际上是不可见的,对吗?

使用词法分析器将离散字符序列识别为标记。使用解析器识别标记之间的句法关系。使用 walker 来分析语义关系。

例如,您可以允许词法分析器忽略所有空格,让解析器识别列表元素(独立于级别),并且在遍历时,在进入每个列表元素上下文时,引用输入流以计算前导空格.