简单语法上的 ANTLR MismatchedTokenException

发布于 2024-08-24 21:21:28 字数 674 浏览 4 评论 0原文

我对 ANTLR 和 EBNF 语法完全陌生,所以这可能是我根本不理解的一个基本问题。

我有一个规则,例如:与

version_line : WS? 'VERS' WS? '=' WS? '1.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

我的输入文件中的语句匹配,如下所示(带有可选空格):

VERSION = 1.0

使用上面的规则形式,我得到了成功的匹配,尽管我得到了这种形式的异常:

version_line : WS? 'VERS' WS? '=' WS? '1' '.0' WS? EOL ;

或这个形式:

version_line : WS? 'VERS' WS? '=' WS? DIGIT '.0' WS? EOL ;
DIGIT : '1' ;

为什么会有所不同?我在尝试进一步分解规则时发现了这个问题,希望最终得到这样的结果:

version_line : WS? 'VERS' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ;
DIGIT : '0'..'9' ;

I'm completely new to ANTLR and EBNF grammars to begin with, so this is probably a basic issue I'm simply not understanding.

I have a rule such as:

version_line : WS? 'VERS' WS? '=' WS? '1.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

that matches a statement in my input file that looks like this (with optional whitespace):

VERSION = 1.0

With the rule form above, I'm getting a successful match, although I get an exception with this form:

version_line : WS? 'VERS' WS? '=' WS? '1' '.0' WS? EOL ;

or this form:

version_line : WS? 'VERS' WS? '=' WS? DIGIT '.0' WS? EOL ;
DIGIT : '1' ;

Why is this different? I discovered this issue when trying to decompose the rule even more, hopefully ending up with something like this:

version_line : WS? 'VERS' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ;
DIGIT : '0'..'9' ;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怀念你的温柔 2024-08-31 21:21:28

我认为没有问题,所有四种语法都会产生预期的 AST:

1

version_line : WS? 'VERSION' WS? '=' WS? '1.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

替代文字

2

version_line : WS? 'VERSION' WS? '=' WS? '1' '.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

3

version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.0' WS? EOL ;
DIGIT : '1' ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

4

version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ;
DIGIT : '0'..'9' ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

使用输入:(

VERSION = 1.0
#

请注意,输入中的 # 是换行符!)

使用 ANTLRWorks v1.3.1。

I see no problem, all four grammars produce the expected AST:

1

version_line : WS? 'VERSION' WS? '=' WS? '1.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

alt text

2

version_line : WS? 'VERSION' WS? '=' WS? '1' '.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

alt text

3

version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.0' WS? EOL ;
DIGIT : '1' ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

alt text

4

version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ;
DIGIT : '0'..'9' ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

alt text

with input:

VERSION = 1.0
#

(Note that the # in the input is a new line char!)

Tested with ANTLRWorks v1.3.1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文