Antlr和PL/I语法

Antlr和PL/I语法,antlr,antlr4,Antlr,Antlr4,现在,我们需要PL/I语法,基于Antlr4的COBOL。有人提供这些语法吗 如果没有,你能分享一下你对从头开发这些语法的想法/经验吗 谢谢我想你指的是IBM PL/I和COBOL。(其他PL/的例子并不多,但我认为这并不会真正改变答案) 寻找成熟ANTLR语法的明显地方是;没有PL/1或COBOL语法。Antlrv4(ANTLR3的一个非常新的、激进的、向后不兼容的再工程)主页讨论Java和C#;没有PL/1或COBOL的迹象;考虑到它的新颖性,这并不奇怪。如果你真的很幸运,可能有人会给你一个

现在,我们需要PL/I语法,基于Antlr4的COBOL。有人提供这些语法吗 如果没有,你能分享一下你对从头开发这些语法的想法/经验吗
谢谢

我想你指的是IBM PL/I和COBOL。(其他PL/的例子并不多,但我认为这并不会真正改变答案)

寻找成熟ANTLR语法的明显地方是;没有PL/1或COBOL语法。Antlrv4(ANTLR3的一个非常新的、激进的、向后不兼容的再工程)主页讨论Java和C#;没有PL/1或COBOL的迹象;考虑到它的新颖性,这并不奇怪。如果你真的很幸运,可能有人会给你一个,然后大声说出来

开发这样的语法很困难,原因有几个(基于个人经验,为这两个特定项构建生产质量解析器,使用与ANTLR不同的非常强大的解析器系统[有关更多详细信息,请参阅我的简历]):

  • 字符集和列布局规则(第1-5列、第6列和第72-80列是特殊的)可能是一个问题:您描述的语言通常以EBCDIC编写,历史上采用穿孔卡80列格式,行与行之间没有换行符。转换为ASCII有时会产生严重的故障;在CBOL文字字符串的中间,偶尔会发现ASCII结尾字符作为二进制值,但是因为它在EBCDIC和ASCII中具有相同的精确代码,在翻译之后,它将(将和)看起来是ASCII换行符。字符串也可以很长,但可以跨多行拆分;但根据定义,第72-80列必须被忽略。第6列可能包含一个“D”字符,这会影响以下源代码行的解释为“debug”或“not”。这意味着您需要正确处理80列。我不知道ANTLR必须支持在列区域中处理字符。如果源代码在非英语国家(如日本)使用,您还需要担心字符串文本的DBCS编码以及其变体
  • 这些语言庞大而复杂;IBM用了40年的时间来装饰它们。IBM COBOL手册大约有600页。。。然后您发现COBOL还包括一个报告编写器,它是另一个600页的文档。捕获词法标记和语法规则的所有细微差别需要付出努力,您必须从IBM手册中完成这项工作,其中不包含漂亮的BNF样式描述,这意味着从文本描述和一些示例中进行猜测。对于COBOL,需要几千条语法规则;PL/1在抽象上没有那么复杂。期待一定数量的“谎言”;我们遇到过许多地方,参考文档明确指出某些东西是不合法的,但是IBM编译器(基于真实的、运行的源代码)接受它们,反之亦然。找到这些的唯一方法是通过经验实验
  • 这两种语言都有难以解析的结构,例如,需要任意前瞻和/或局部歧义。从我对这些方面的理解来看,ANTLR4比ANTLR3好得多,但这并不意味着这些方面会很容易。PL/1在这方面尤其糟糕:它没有关键字,但上下文中有数百个关键字。要解决这些问题,必须让词法分析器和解析器合作,即使这样,也可能会有许多局部不明确的解析。ANTLR3在这些方面做得不好;ANTLR4应该更好,但我不知道它如何处理这个问题,如果它真的这样做的话
  • 要验证这些解析器是否正确,您需要在数百万行代码上运行它们(这意味着您必须能够访问这些代码示例),并更正发现的任何错误。这需要很长的时间(在我们的例子中,需要几年左右的持续工作/改进才能获得在大型代码库上工作的生产质量语法)。你可能比这快得不可思议;祝你好运
  • 您需要为COBOL(COPY…replacement)构建一个预处理器,它的详细信息没有很好的文档记录,最终为PL/1构建另一个预处理器(据我所知,它完全支持图灵)
  • 构建解析器后,需要捕获语法树;在这里,ANTLR4应该是相当好的,因为它将根据您给出的语法捕获一个。这可能是你想要的,也可能不是;有几千条语法规则,我想不会。ANTLR3要求您手动添加关于在何处以及如何形成AST的指示
在你拿到AST后,你会想用它做点什么。这意味着您至少需要构建符号表(从标识符实例到它们的声明和任何相关类型信息的映射)。ANTLR没有提供任何特殊的支持,除了在ASTs上行走的支持。这也很难做到正确,COBOL有一些疯狂的规则,关于在没有其他冲突解释的情况下如何将非限定标识符引用解释为特定数据字段。(如果您想获得有关程序的良好语义信息,解析后还有很多事情要做;有关更多详细信息,请参阅我的简历;对于这些语义方面,您已经开发了它们,然后为了验证,请返回并在大型代码基上再次运行它们。)

TL;博士


无论您选择何种解析引擎,为这些语言构建解析器(嗯,“前端”)都是一项艰巨的工作。很可能解释了为什么它们还没有进入ANTLR的语法动物园。

看看ProLeap基于antlr4并创建AST和ASG的开源Cobol-85解析器。 而且,最重要的是,它真的有效

我不知道有类似的PLI语法,但一个非常好的开端是Ralf Lämmel(CWI,阿姆斯特丹)和Chris Verhoef(WINS,Universitet van Amsterdam)的EBNF定义

非常感谢你,Ira,我很感激有坏消息总比没有好。。。谢谢现在还有另一张海报