首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr和PL/I语法

Antlr和PL/I语法
EN

Stack Overflow用户
提问于 2014-10-15 07:59:57
回答 2查看 2.1K关注 0票数 2

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

EN

回答 2

Stack Overflow用户

发布于 2014-10-15 11:23:17

我想您是指IBM /I和COBOL。(其他PL/存在的并不多,但我认为这并没有真正改变答案)。

寻找成熟的ANTLR语法的明显地方是ANTLR3语法库;那里没有PL/1或COBOL语法。Antlr V4 (一个非常新的、激进的、向后不兼容的ANTLR3重组)主页谈到了ANTLR3和C#;这里没有PL/1或COBOL的暗示;鉴于它的新颖性,也就不足为奇了。如果你真的很幸运,有人可能会给你一个,然后大声说出来。

开发这样的语法是困难的,原因有几个(根据为这两个特定项目构建生产质量解析器的个人经验,使用一个与ANTLR不同的非常强大的解析器系统-参见我的bio获取更多细节):

  • 字符集和列布局规则(列1-5、6和72-80是特殊的)可能是一个问题:您描述的语言通常是用EBCDIC编写的,历史上是以穿孔卡80列格式编写的,没有行间中断字符。翻译到ASCII有时会产生严重的错误;在COBOL直译字符串中间偶尔会发现ASCII作为二进制值,但由于它在EBCDIC和ASCII中具有相同的代码,在翻译后它将(be和)显示为ASCII换行符字符。字符串也可以是长的,但可以分割成多行;但是定义上的列72-80必须被忽略。第6栏可能包含"D“字符,这会影响将下列源行解释为”调试“或”不“。这意味着您需要正确处理80列。我不知道ANTLR有什么可以支持处理列中字符的区域。您还需要担心字符串文本的DBCS编码,如果源代码用于非英语国家(如日本),则需要考虑其中的变体。
  • 这些语言是庞大而复杂的;IBM已经用了40年的时间用cruft来装饰它们。IBM COBOL手册大约有600页。然后您会发现COBOL还包括一个Report,这是另一个600页的文档。捕获词汇标记和语法规则的所有细微之处将需要付出很大的努力,您必须从IBM手册中做到这一点,这些手册不包含很好的BNF风格的描述,这意味着从文本描述和一些示例中猜测。对于COBOL,需要几千条语法规则;PL/1在抽象上不那么复杂。期待一定数量的“谎言”;我们遇到了一些地方,参考文档清楚地指出某些事情是不合法的,但是IBM编译器(基于真实的、正在运行的源代码)接受它们,反之亦然。你找到这些的唯一方法就是通过经验实验。
  • 这两种语言都有很难解析的结构,例如,需要任意的前瞻性和/或局部歧义。从我对这些方面的理解来看,ANTLR4比ANTLR3要好得多,但这并不意味着这些方面会很容易。在这方面,PL/1特别令人讨厌:它没有关键字,但有数百个关键字在上下文中。要解决这些问题,就必须让lexer和解析器进行协作,即使这样,也可能存在许多本地歧义分析。ANTLR3没有很好地完成这些任务;ANTLR4应该更好,但我不知道它是如何处理这个问题的,如果是这样的话。
  • 要验证这些解析器是否正确,您需要在数百万行代码上运行它们(这意味着您必须访问此类代码示例),并更正所发现的任何错误。这需要很长时间(在我们的例子中,需要几年的持续工作/改进才能获得在大型代码基础上工作的产品质量语法)。你可能会比这个快得多,祝你好运。
  • 你需要为COBOL建立一个预处理程序(拷贝.(替换),其细节记录不全,最终另一个用于PL/1 (据我所知,它完全具有图灵通的能力)。
  • 在构建解析器之后,您需要捕获语法树;在这里,ANTLR4应该非常好,因为它将为您提供的语法捕获一个。这可能是你想要的AST,也可能不是你想要的;有了几千条语法规则,我就不会了。ANTLR3要求您手动添加在何处以及如何形成AST的指示。

拿到AST后,你会想用它做点什么的。这意味着您至少需要构建符号表(从标识符实例到其声明和任何相关类型信息的映射)。ANTLR没有提供任何特殊的支持这个AFAIK,除了支持步行的AST。这也很难纠正,COBOL有疯狂的规则,如果没有其他冲突的解释,那么如何将不合格的标识符引用解释为特定的数据字段。(如果您想要获得有关该程序的良好语义信息,那么在解析后还有更多关于Life的内容;请参阅我的bio以获得更多细节;对于这些语义方面,您都开发了它们,然后为了验证,请返回并在大型代码基础上运行它们。)

TL;DR

为这些语言构建解析器(嗯,“前端”)是一项很大的工作,不管您选择哪个解析引擎。很可能解释了为什么他们还没有在ANTLR的语法动物园里。

票数 4
EN

Stack Overflow用户

发布于 2017-08-22 07:08:53

看看OpenSource Cobol-85解析器来自ProLeap,基于antlr4并创建as和ASG。而且,最棒的是,它真的有效!

https://github.com/uwol/proleap-cobol-parser

我不知道有类似的PLI语法,但是一个很好的开端是来自Ralf L (CWI,阿姆斯特丹)和Chris Verhoef (WINS,Universiteit van阿姆斯特丹)的http://www.cs.vu.nl/grammarware/browsable/os-pli-v2r3/的EBNF定义。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26377386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档