我认为你的意思是IBM PL / I和COBOL。 (并没有很多其他的PL / Is,但我认为这不会真正改变答案)。
寻找成熟的ANTLR语法的显而易见的地方是ANTLR3 grammar library;那里没有PL / 1或COBOL语法。 Antlr V4(ANTLR3的一个非常新的,激进的,向后不兼容的重新设计)主页讨论Java和C#;那里没有PL / 1或COBOL的暗示;鉴于其新颖性,毫不奇怪。如果你真的很幸运,有人可能会有一个他们会给你并说出来。
开发此类语法很困难有几个原因(基于个人经验为这两个特定项目构建生产质量解析器,使用与ANTLR不同的非常强大的解析器系统[有关详细信息,请参阅我的简历]):
- 字符集和列布局规则(第1-5,6和72-80列是特殊的)可能是个问题:您描述的语言通常以打孔卡80列格式在EBCDIC中编写,没有换行符线之间。转换为ASCII有时会产生令人讨厌的故障;偶尔在COBOL文字字符串中间找到ASCII行尾字符作为二进制值,但因为它在EBCDIC和ASCII中具有相同的精确代码,所以在翻译后它将(和)似乎是一个ASCII换行符。字符串也可以很长但分成多行;但是根据定义,第72-80列必须被忽略。第6列可能包含" D"字符,它影响以下源代码行的解释为" debug"或者"不是"。这意味着您需要正确处理80列。我不知道ANTLR支持处理列中字符区域的内容。您还需要担心字符串文字的DBCS编码,以及在非英语国家(如日本)使用源代码时的变体。
- 这些语言庞大而复杂; IBM已经用了40年的时间来装饰它们。 IBM COBOL手册大约有600页......然后您发现COBOL还包括一个Report Writer,它是另一个 600页文档。捕获词法标记的所有细微差别和语法规则将需要付出努力,您必须从IBM手册中做到这一点,这些手册不包含漂亮的BNF风格描述,这意味着从文本描述和一些示例中猜测。对于COBOL,期望几千个语法规则; PL / 1在摘要中不那么复杂。期待一定数量的谎言&#34 ;;我们在一些地方遇到过参考文档明确说明某些事情不合法的地方,但IBM编译器(基于真实的,运行的源代码)接受它们,反之亦然。你找到这些的唯一方法是通过实证实验。
- 两种语言都具有难以解析的结构,例如,需要任意的先行和/或局部模糊。根据我对这些方面的理解,ANTLR4比ANTLR3要好得多,但这并不意味着这些方面很容易。 PL / 1在这方面特别令人讨厌:它没有关键词,但在上下文中有数百个关键词。要解决这些问题,必须让词法分析器和解析器合作,即使这样,也可能存在许多本地模糊的解析。 ANTLR3做得不好; ANTLR4应该会更好但我不知道它是如何处理它的,如果有的话。
- 要验证这些解析器是否正确,您需要在数百万行代码上运行它们(这意味着您必须能够访问此类代码示例),并更正您找到的任何错误。这需要很长时间(在我们的例子中,几年或多或少的连续工作/改进,以获得适用于大型代码库的生产质量语法)。你可能奇迹般地比这更快;祝你好运。
- 您需要为COBOL(COPY ... REPLACING)构建一个预处理器,其详细信息记录很少,最后还有另一个用于PL / 1(我理解为完全具有Turing功能)。
- 构建解析器后,需要捕获语法树;在这里,ANTLR4应该是相当不错的,因为它会为你提供的语法捕获一个。那可能是也可能不是你想要的AST;有几千个语法规则,我不指望。 ANTLR3要求您手动添加指示AST的形成位置和方式。
获得AST之后,你会想要用它做点什么。这意味着您将需要至少构建符号表(从标识符实例到其声明的映射以及任何相关的类型信息)。 ANTLR没有提供任何特殊支持这种AFAIK,除了支持AST的行走。这也很难做到,如果没有其他冲突的解释,COBOL就如何将非限定标识符引用解释为特定数据字段有疯狂的规则。 (如果你想获得关于程序的良好语义信息,那么解析后的生活还有很多;请参阅我的生物了解更多细节;对于这些语义方面的每一个,你都要开发它们然后进行验证然后再运行它们再次在大型代码库上。)。
TL; DR
无论您选择何种解析引擎,为这些语言构建解析器(以及#34;前端")都是 lot 的工作。可能解释了为什么他们还没有进入ANTLR的语法动物园。
从ProLeap看一下 OpenSource Cobol-85 Parser,基于antlr4并创建AST和ASG。
而且,最重要的是,它确实有效!
https://github.com/uwol/proleap-cobol-parser
我不知道可比较的PLI语法,但是一个非常好的开始是来自RalfLämmel(CWI,Amsterdam)的EBNF定义& Chris Verhoef(WINS,Universiteit van Amsterdam)
http://www.cs.vu.nl/grammarware/browsable/os-pli-v2r3/