我正在一个相当标准的编译器项目上,为此我选择了ANTLR作为解析器生成器。在将现有语法从v2更新到v3时,我注意到ANTLRWorks(ANTLR的官方IDE)没有在文件中正确显示任何扩展的ASCII字符。即使使用Notepad ++将文件从ASCII转换为UTF8后,它仍然将那些字符显示为正方形。在记事本++中,它们显示良好。

由于此故障意味着ANTLRWorks在保存文件时会损坏该文件,因此我无法再将其用作编辑器,这很烦人。这里有没有其他人遇到过这个问题,也许已经解决了?多谢。

[ edit ]:特定问题发生在最新版本的ANTLRWorks(昨天下载)和我从http://www.antlr.org/grammar/1086696923011/vhdlams/index.html获得的vams.g语法文件中

最佳答案

我无法使用ANTLRWorks 1.4.3重现此内容。

如果我创建一个虚拟语法:

grammar T;
parse : . ;
Any   : . ;

并将完整的扩展ASCII集粘贴到多行注释中:
grammar T;

/*
€

‚
ƒ

...

ÿ
*/

parse : . ;
Any   : . ;

这里没有问题。不管我是使用ANTLRWorks复制字符还是使用普通的编辑器,然后使用ANTLRWorks编辑现有语法,这些字符在保存到ANTLRWorks中后都保持不变。

值得一提的是:ANTLR 3.0到3.3版本仍然与ANTLR 2.7类具有某些依赖性,这可能会导致org.antlr.Tool跳越ASCII集之外的某些字符。在这种情况下,请使用ANTLR 3.4,它不再具有这些旧的依赖项。

编辑

我怀疑原始语法中某个奇怪的字节会导致所有混乱。我很快只复制了原始语法中的规则,将所有v2.7语法更改为v3语法(将双引号文字更改为单引号,protected变为fragment并注释了一些自定义代码)并将其保存在新文件中。该文件可以由ANTLRWorks或纯文本编辑器打开(并保存),而不会导致扩展的ASCII字符损坏。

这是所述语法的ANTLR v3版本:http://pastebin.com/zU4xcvXt(语法太大,无法发布在SO上...)

编辑二

语法名称不仅可以给标签加上标签吗?

不,这不对。正如您提到的,它仅用于为解析器或词法分析器命名。

ANTLR中有4种语法:
  • 组合语法,看起来像grammar T;,生成TLexer.javaTParser.java源文件;
  • 语法分析器语法,类似于parser grammar TP;,生成TP.java源文件;
  • lexer语法,类似于lexer grammar TL;,生成TL.java源文件;
  • 树语法,类似于tree grammar TWalker,生成TWalker.java源文件。
  • 10-06 01:10