当前位置: 首页 > 知识库问答 >
问题:

ANTLR4:为特定规则调用不同的子解析器

华欣怡
2023-03-14

请考虑这个非常简化的示例,其中应该匹配以下形式的输入

mykey -> This is the value
grammar Root;

parse
    : ID '->' value
    ;

value
    : Word+
    ;

ID
    : ('a'..'z')+
    ;


Word
    : ('a'..'z' | 'A'..'Z' | '0'..'9')+
    ;

WS
    : ' ' -> skip
    ;

如果您需要一个简单的实际应用程序,那么您可以考虑Java中的字符串。其中一些可能是需要用完全不同的解析器解析的regex。它类似于您可以在IDEA内部使用的注入语言。

问:在ANTRL4中是否有一种惯用的方法来用不同的语法解析特定的规则?最好的情况是,我可以在语法级别上指定它,以便生成的AST是包含注入语言的子树的外部语言的组合。

共有1个答案

侯令雪
2023-03-14

实际上,使用模式是惯用的解决方案。只需要在识别模式保护时有点创造性:

parser grammar RootParser ;

options {
    tokenVocab = RootLexer ;
}

parse   : ID RARROW value EOF ;
value   : WORD+ ;

lexer grammar RootLexer ;

ID      : [a-z]+      ;
RARROW  : '->' -> pushMode(value) ;

mode value ;
    EOL     : [\r\n]+ -> popMode, skip ;
    WORD    : [a-zA-Z0-9]+  ;
    WS      : ' ' -> skip   ;
 类似资料: