无法在非组合语法中为字符串文字创建隐式标记:'('

时间:2015-12-26 11:15:25

标签: java antlr4

我在两个Lexer和Parser语法中打破了我的组合语法:

组合语法非常简单:

parser grammar Fluent;

fluent
 : MANDATORY
 | PARAMETRIZED '(' PARAMETER ')'
 | OPTIONS OPTION?
 | CHOOCING ( CHOOSE1 | CHOOSE2 )
 | PLUS+
 ;

MANDATORY : 'mandatory';
PARAMETRIZED : 'parameterized';
PARAMETER : 'parameter';
OPTIONS : 'options';
OPTION : 'option';
CHOOCING : 'choosing';
CHOOSE1: 'choise1';
CHOOSE2: 'choise2';
PLUS: 'plus';

然后我创建了一个带有词法规则的FluentLexer.g4和一个带有解析器规则的FluentParser.g4

然后我在FluentLexer语法上导入了FluentParser语法。

我尝试过两种选择:

  • 使用Fluent Grammar导入FluentLexer:import FluentLexer
  • 使用选项结构:

    options{ language = Java; tokenVocab = FluentLexer; }

使用第一个选项ANTLR转储我:

  

无法在非组合语法中为字符串文字创建隐式标记:'('

     

错误(126):FluentParser.g4:7:30:无法在非组合语法中为字符串文字创建隐式标记:')'

     

错误(126):FluentParser.g4:3:12:无法在非组合语法中为字符串文字创建隐式标记:'强制性'

     

错误(126):FluentParser.g4:4:15:无法在非组合语法中为字符串文字创建隐式标记:'参数化'

     

错误(126):FluentParser.g4:5:12:无法在非组合语法中为字符串文字创建隐式标记:'参数'

     

...

似乎导入了Lexer规则。

第二个选项,ANTLR仅告诉我:

  

错误(126):FluentParser.g4:10:16:无法在非组合语法中为字符串文字创建隐式标记:'('

     

错误(126):FluentParser.g4:10:3​​0:无法在非组合语法中为字符串文字创建隐式标记:')'

为什么我需要定义')'和'('在分离的语法中,为什么我不需要在组合语法上定义它们?

我怎么能解决这个问题?我想使用'(' or ')' insX LEXER规则...

1 个答案:

答案 0 :(得分:1)

这是一项仅适用于组合语法的功能。可能有助于加快开发/原型设计。但是,对用户lexer规则来说“更好”。请参阅:此Q& A:Is "Implicit token definition in parser rule" something to worry about?

  

我怎么能解决这个问题?我想使用LEXER规则的'('或')'......

你不能使用单独的语法。