ANTLR 通配符运算符不消耗预期的输入
ANTLR wildcard operator not consuming expected input
我正在编写一个在 yacc 规范文件中读取的 antlr 语法。 Yacc 规范文件的格式为
declarations
%%
rules
%%
programs
但是,我只对 yacc 规范文件的声明和规则部分感兴趣。我已经定义了与声明和规则相匹配的规则,但我试图使用通配符 (.*?) 来匹配第二个“%%”之后的所有内容。这失败了。这是
Link to my anltr grammar for yacc grammars
如何匹配第二个“%%”之后的内容。
我也尝试使用
匹配除 EOF 之外的任何内容
<some_rule> : ~(EOF)* ;
您可以做的是创建一个单独的词法分析器语法,以便您可以使用 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
我正在编写一个在 yacc 规范文件中读取的 antlr 语法。 Yacc 规范文件的格式为
declarations
%%
rules
%%
programs
但是,我只对 yacc 规范文件的声明和规则部分感兴趣。我已经定义了与声明和规则相匹配的规则,但我试图使用通配符 (.*?) 来匹配第二个“%%”之后的所有内容。这失败了。这是
Link to my anltr grammar for yacc grammars
如何匹配第二个“%%”之后的内容。
我也尝试使用
匹配除 EOF 之外的任何内容<some_rule> : ~(EOF)* ;
您可以做的是创建一个单独的词法分析器语法,以便您可以使用 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