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