Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ANTLR通配符运算符未使用预期输入_Java_Antlr_Antlr4_Antlr3 - Fatal编程技术网

Java ANTLR通配符运算符未使用预期输入

Java ANTLR通配符运算符未使用预期输入,java,antlr,antlr4,antlr3,Java,Antlr,Antlr4,Antlr3,我正在编写一个antlr语法,它读取yacc规范文件。Yacc规范文件的格式如下 declarations %% rules %% programs 然而,我只对yacc规范文件的声明和规则部分感兴趣。我已经定义了与声明和规则很好匹配的规则,但我试图使用通配符运算符(.*)匹配第二个'%'之后的所有内容。这是失败的。这是 如何匹配第二个“%”后面的内容 我也尝试过匹配任何东西,但EOF使用 <some_rule> : ~(EOF)* ; :~(EOF)*; 您可以做的是

我正在编写一个antlr语法,它读取yacc规范文件。Yacc规范文件的格式如下

declarations 
%%
rules 
%%
programs 
然而,我只对yacc规范文件的声明和规则部分感兴趣。我已经定义了与声明和规则很好匹配的规则,但我试图使用通配符运算符(.*)匹配第二个'%'之后的所有内容。这是失败的。这是

如何匹配第二个“%”后面的内容

我也尝试过匹配任何东西,但EOF使用

<some_rule> : ~(EOF)* ;
:~(EOF)*;

您可以做的是创建一个单独的lexer语法,以便使用

这样,您可以在默认声明模式下启动,当您第一次遇到
%%
时,您将进入
规则模式。当您遇到另一个
%%
时,您将进入
子例程\u模式
。在最后一种模式中,只需跳过遇到的所有字符

快速演示:

// 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
   ;
如果您根据上述语法生成lexer,并对输入进行标记化:

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