【问题标题】:ANTLRWorks 1.4.3 can't properly read extended-ASCII charactersANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符
【发布时间】:2011-12-03 23:41:53
【问题描述】:

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

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

[edit]:最新版本的ANTLRWorks(昨天下载)和我从http://www.antlr.org/grammar/1086696923011/vhdlams/index.html获得的vams.g语法文件出现了具体问题

【问题讨论】:

    标签: antlr antlrworks


    【解决方案1】:

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

    【讨论】:

    • 我编辑了问题以添加指向我正在修改的特定语法文件的链接。请尝试用它重现问题:)
    • 谢谢你,Bart :) 我将粘贴复制到 Notepad++ 中的文件中,保存后我可以在 ANTLRWorks 中毫无问题地打开它。我将尝试重新添加其他部分(选项、标题),看看效果如何。不确定我们是否会弄清楚究竟是什么导致了这个问题,不过……这似乎与 ANTLRWorks 处理文件的方式有关。顺便说一句:为什么 ANTLWorks 会将 VAMS 标记为“无效的语法名称”?编辑:哦,似乎语法和文件名必须匹配:)
    • @MayaPosch,不客气。如果您将语法命名为 VAMS.g 以外的语法,ANTLRWorks 将抱怨它的名称:组合的 grammar X(包括解析器 词法分析器规则),必须命名为 X.g
    • 语法名称除了给它一个标签之外还有什么用处吗?
    • 太棒了,非常感谢 :) 我把额外的东西放回语法文件并重新启用了自定义位,没有任何破坏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多