【问题标题】:Using multiple lexer commands on one lexer rule in Antlr在 Antlr 的一个词法分析器规则上使用多个词法分析器命令
【发布时间】:2020-05-07 07:12:16
【问题描述】:

我试图在一个词法分析器规则上使用多个词法分析器命令。 我的代码看起来像这样:

LEXER_RULE: something->mode(NUMBER);

mode NUMBER;
NU: [0-9]+ ->mode(ANOTHER_MODE); //Going into another mode in case the NU rule is used

//now leaving the NUMBER mode, in case there is no number written

NO_NUM: ~[0-9]->mode(DEFAULT_MODE);

词法分析器规则 NU 只是可选的,所以我必须涵盖不使用它的情况。但是,我也想跳过 NO_NUM 中的所有内容。 像

NO_NUM:~[0-9]->skip ->mode(DEFAULT_MODE);

我知道我不能在一个词法分析器规则上使用多个词法分析器命令。有谁知道任何其他方法?我需要能够以某种方式离开模式。顺便说一句,我不允许使用语义谓词。谢谢!

【问题讨论】:

    标签: antlr lexer mode


    【解决方案1】:

    你快到了!使用逗号插入:

    NO_NUM : ~[0-9] -> skip, mode(DEFAULT_MODE);
    

    显然,这会丢弃 ~[0-9] 匹配的任何内容。所以,如果你有这个语法:

    ID : [a-zA-Z]+;
    ...
    
    mode NUMBER;
      NU.    : [0-9]+ -> mode(ANOTHER_MODE);
      NO_NUM : ~[0-9] -> skip, mode(DEFAULT_MODE);
    
    mode ANOTHER_MODE;
      ...
    

    而在mode NUMBER中遇到abc,则a被丢弃,bc将变成ID。如果您还希望a 成为ID 的一部分,那么您需要这样做:

    ID : [a-zA-Z]+;
    ...
    
    mode NUMBER;
      NU.    : [0-9]+ -> mode(ANOTHER_MODE);
      NO_NUM : ~[0-9] -> more, mode(DEFAULT_MODE);
    
    mode ANOTHER_MODE;
      ...
    

    更多关于 Lexer 命令:https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md#lexer-commands

    【讨论】:

    • 您甚至解决了我因跳过第一个标志而遇到的问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多