我正在编写一个在yacc规范文件中读取的antlr语法。YACC规格文件是
的形式declarations
%%
rules
%%
programs
但是,我只对YACC规格文件的声明和规则部分感兴趣。我已经定义了规则,这些规则符合声明和规则很好,但是我试图使用通配符操作员(。*?)匹配第二个" %%"之后的所有内容。这失败了。这是
链接到我的YACC语法ANLTR语法
我如何匹配第二个" %%"之后发生的任何内容。
我还尝试使用
来匹配EOF以外的任何内容<some_rule> : ~(EOF)* ;
以下是失败的文件的示例
您可以做的就是创建一个单独的lexer语法,以便您可以使用词汇模式。
这样,您以默认声明模式开始,当您第一次遇到%%
时,您可以推入RULE_MODE
。当您遇到另一个%%
时,您会推入SUBROUTINE_MODE
。在最后一个模式下,您只需 skip
遇到的所有字符。
快速演示:
// File: YaccLexer.g4
lexer grammar YaccLexer;
DECLARATION_TOKEN
: [a-zA-Z]+
;
SPACES
: [ trn]+ -> skip
;
DECLARATION_END
: '%%' -> skip, pushMode(RULE_MODE)
;
mode RULE_MODE;
RULE_TOKEN
: [a-zA-Z]+
;
SPACES_RULE_TOKEN
: [ trn]+ -> 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