我正在研究一个相当标准的编译器项目,我选择ANTLR作为解析器生成器。在将现有语法从v2更新到v3时,我注意到ANTLR的官方IDE ANTLRWorks没有正确显示文件中的任何扩展ASCII字符。即使在使用Notepad ++将文件从ASCII转换为UTF8之后,它仍然将这些字符显示为正方形。在Notepad ++中,它们显示正常。
由于这个故障意味着ANTLRWorks在保存文件时会将文件归档,我不能再将其用作编辑器了,这很烦人。这里有没有其他人遇到这个问题,也许解决了吗?很有责任。
[编辑]:特定问题出现在最新版本的ANTLRWorks(昨天下载)和我从http://www.antlr.org/grammar/1086696923011/vhdlams/index.html获得的vams.g语法文件
答案 0 :(得分:2)
我无法使用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.java
和TParser.java
源文件; parser grammar TP;
,生成TP.java
源文件; lexer grammar TL;
,生成TL.java
源文件; tree grammar TWalker
,生成TWalker.java
源文件。