我无法用 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 语法,看起来像
lexer grammar TL;
,生成TL.java
源文件;
- 树语法,看起来像
tree grammar TWalker
,生成一个TWalker.java
源文件。