我已经将组合语法分解为两种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';
然后,我创建了一个带有lexer规则的FluentLexer.g4
和一个带有解析器规则的FluentParser.g4
。
然后我在FluentParser
语法上导入了FluentLexer
语法。
我试过两种选择:
- 在Fluent Grammar中导入FluentExer:
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:无法在非组合语法中为字符串文字创建隐式令牌:"parameter"
Lexer规则似乎是导入的。
对于第二个选项,ANTLR只告诉告诉:
错误(126):FluentParser.g4:10:16:无法为非组合语法中的字符串文字创建隐式令牌:"("
错误(126):FluentParser.g4:10:30:无法为非组合语法中的字符串文字创建隐式令牌:")"
为什么我需要在分离语法中定义")"one_answers"(",为什么我不需要在组合语法中定义它们?
我该怎么解决?我想用'(' or ')'
代替LEXER规则。。。
这是一个仅适用于组合语法的功能。可能有助于加快开发/原型设计。然而,使用lexer规则"更好"。请参阅:本问答;A: 是";语法分析器规则中的隐式标记定义";有什么好担心的吗?
我该怎么解决?我想使用"("或")"代替LEXER规则。。。
你不能用单独的语法。