ANTLR通配符运算符不消耗预期输入

问题描述 投票:1回答:1

我正在编写一个读取yacc规范文件的antlr语法。 Yacc规范文件的形式

declarations 
%%
rules 
%%
programs 

但是,我只对yacc spec文件的声明和规则部分感兴趣。我已经定义了与声明和规则匹配良好的规则,但我试图使用通配符运算符(。*?)匹配第二个'%%'之后的所有内容。这失败了。这是 Link to my anltr grammar for yacc grammars

如何匹配第二个'%%'之后的内容。

除了使用EOF,我还尝试过匹配任何东西

<some_rule> : ~(EOF)* ;

Here's an example of the file that fails

java antlr antlr4 antlr3
1个回答
2
投票

你可以做的是创建一个单独的词法分析器语法,以便你可以使用lexical modes

这样,你从默认声明模式开始,当你第一次遇到%%时,你进入RULE_MODE。当你遇到另一个%%时,你会进入SUBROUTINE_MODE。在这最后一种模式中,你只需要skip你遇到的所有角色。

快速演示:

// File: YaccLexer.g4
lexer grammar YaccLexer;

DECLARATION_TOKEN
 : [a-zA-Z]+
 ;

SPACES
 : [ \t\r\n]+ -> skip
 ;

DECLARATION_END
 : '%%' -> skip, pushMode(RULE_MODE)
 ;

mode RULE_MODE;

  RULE_TOKEN
   : [a-zA-Z]+
   ;

  SPACES_RULE_TOKEN
   : [ \t\r\n]+ -> skip
   ;

  RULE_END
   : '%%' -> skip, pushMode(SUBROUTINE_MODE)
   ;

mode SUBROUTINE_MODE;

  ANY
   : . -> skip
   ;

如果您从上面的语法生成词法分析器,并标记输入:

foo
bar

%%

baz

%%

ignore
me

将创建以下令牌:

DECLARATION_TOKEN         'foo'
DECLARATION_TOKEN         'bar'
RULE_TOKEN                'baz'

您可以在解析器语法中使用YaccLexer,如下所示:

// File: YaccParser.g4
parser grammar YaccParser;

options {
  tokenVocab= YaccLexer;
}

// your parser rules here
© www.soinside.com 2019 - 2024. All rights reserved.