【问题标题】:ANTLR Lexer rules - enter a pushMode based on what is in the beginning of lineANTLR Lexer 规则 - 根据行首的内容输入 pushMode
【发布时间】:2015-01-31 13:11:46
【问题描述】:

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

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。我是否以某种方式弄乱了空白的东西?我在词法分析器中没有 -> 跳过或隐藏通道之类的东西。剩下的:

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

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

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为我在 walker 中做的工作越少越好,我认为它仅用于创建填充来自解析器的数据的域模型。我想在 walker 中做的最多的事情是通过从字符串等中修剪空白来清理一些东西。感谢您的提示,我会考虑并评估它。
    • Walkers 天生就很快,所以很容易使用很多,每个都专用于特定任务(回答特定的语义问题)。还有 XPath 允许您探测解析树中的特定节点(测试语义关系)。如果回答有帮助,请采纳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多