ANTLR通配符操作员不消耗预期输入



我正在编写一个在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

相关内容

  • 没有找到相关文章

最新更新