我在两个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
语法。
我尝试过两种选择:
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:30:无法在非组合语法中为字符串文字创建隐式标记:')'
为什么我需要定义')'和'('在分离的语法中,为什么我不需要在组合语法上定义它们?
我怎么能解决这个问题?我想使用'(' or ')'
insX LEXER规则...
答案 0 :(得分:1)
这是一项仅适用于组合语法的功能。可能有助于加快开发/原型设计。但是,对用户lexer规则来说“更好”。请参阅:此Q& A:Is "Implicit token definition in parser rule" something to worry about?
我怎么能解决这个问题?我想使用LEXER规则的'('或')'......
你不能使用单独的语法。