ANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符

标签 antlr antlrworks

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

因为这个故障意味着 ANTLRWorks 在我保存文件时损坏了文件,所以我不能再将它用作编辑器,这很烦人。这里有没有其他人遇到过这个问题,也许已经解决了?非常感谢。

[编辑]:最新版本的 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 (语法太大,所以发不上去……)

编辑二

Is the grammar name useful for anything beyond just giving it a label?

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

ANTLR 中有 4 种文法:

  • 组合语法,类似grammar T;,生成TLexer.javaTParser.java源文件;
  • parser grammar,类似parser grammar TP;,生成TP.java源文件;
  • lexer grammar,看起来像lexer grammar TL;,生成一个TL.java源文件;
  • 树语法,看起来像树语法TWalker,生成一个TWalker.java源文件。

关于ANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371956/

相关文章:

java - 如何安装antlr4?

antlr - 左递归ANTLR文法

code-generation - ANTLRWorks TestRig 编译时卡住

java - 使用 ANTLR4 解析文件

parsing - 如何使用antlr4中的Listener方法获取解析器的内容?

constructor - 强制 ANTLR 在解析器中使用我的自定义 TreeAdaptor

java - ANTLR,不匹配的 token 异常,预期\u000F

parsing - ANTLR语法: parser- and lexer literals

antlr - 如何解决 Antlr3 中的解析歧义

java - 读取 ANTLR 中的多行值,直到出现特殊符号