我之前已经问过这个问题,但我没有找到解决我具体问题的方法。我正在使用Antlr4和C#目标,我有以下词法分析器规则:
INT : [0-9]+
;
LETTER : [a-zA-Z_]+
;
WS : [ \t\r\n\u000C]+ -> skip
;
LineComment
: '#' ~[\r\n]* -> skip
;
这些都是词法规则,但是我有很多解析器规则,我不会在这里发布,因为我认为它不相关。 我遇到的问题是不会跳过空格。当词法分析器运行我的输入后检查令牌流时,空格仍在那里,因此导致错误。我使用的输入是相对基础的:
"fd 100"
它解析完成,直到达到此解析器规则:
noSignFactor
: ':' ident #NoSignFactorArg
| integer #NoSignFactorInt
| float #NoSignFactorFloat
| BOOLEAN #NoSignFactorBool
| '(' expr ')' #NoSignFactorExpr
| 'not' factor #NoSignFactorNot
;
integer : INT #IntegerInt
;
答案 0 :(得分:4)
首先将语法分成单独的词法分析器语法和解析器语法。例如,如果您有grammar Foo;
,请创建以下内容:
创建文件 FooLexer.g4 ,并将所有词法规则从 Foo.g4 移至 FooLexer.g4 。
创建文件 FooParser.g4 ,并将所有解析器规则从 Foo.g4 移至 FooParser.g4 。
在 FooParser.g4 中包含以下选项:
options {
tokenVocab=FooLexer;
}
这种分离将确保您的解析器不会以静默方式为您创建词法分析器规则。在组合语法中,在解析器规则中使用诸如'not'
之类的文字将为您创建词法分析器规则(如果尚不存在)。当发生这种情况时,很容易忘记你的词法分子能够产生什么类型的标记。当您使用单独的词法分析器语法时,您需要显式声明如下所示的规则,以便在解析器规则中使用'not'
。
NOT : 'not';
如果您在解析器规则中的某处包含文字' '
,这应该可以解决空白问题。