antlr可以做类型依赖的解析吗?
让我问一下antlr3是否接受下面的例子语法。antlr可以做类型依赖的解析吗?
for an input , x + y * z ,
it is parsed as x+(y*z) if each in {x,y,z} is a number;
it is parsed as (x+y)*z if each in {x,y,z} is an object of a particular type T;
让我问一下这样的语法是否有时或很少用于计算机语言。
非常感谢。
通常,解析器(由解析器生成器生成)仅检查语法。 (我相信ANTLR是通过回溯来完成的;其他解析引擎[GLR,Earley]通过对可能的解析进行并行探索来实现它),如果增加了语义检查信息,可以拒绝不符合语义约束的分析。
根据我的经验,人们往往不会构建这样的解析器,部分原因是很难向用户解释。如果他们没有得到它,你的解析器不成功;就解释能力而言,你的例子尤其糟糕。他们也倾向于不这样做,因为他们需要这种类型的信息,并且在解析时收集并不总是很方便。海湾合作委员会解析器著名做到这这这解析语句,如
X*T;
和解析器是有点,因为需要解析和它去收集此类信息的一塌糊涂。
我怀疑ANTLR可以检查语义谓词。获得这类语义检查类型信息的容易程度是另一个问题;我在这里没有经验。
我们的DMS Software Reengineering Toolkit使用的GLR解析引擎确实具有“语义”谓词。通过架构设计获得真正的语义类型信息并不是那么容易。我们希望这样的谓词能够脱离“语法”。但是,所有的事情(包括类型推断)都是由语法驱动的。所以我们把纯粹的本地信息固定在提议的缩减之上。这是格外得心应手中(未)识别为独立的类型解析的,下面的特有FORTRAN构建用于嵌套-DO-终止与共享-DO-终止:
DO 10 I=1,10,1
DO 10 J=1,10,1
A(I,J)=0
10 CONTINUE
20 CONTINUE
与
DO 20 I=1,10,1
DO 10 J=1,10,1
A(I,J)=0
10 CONTINUE
20 CONTINUE
解析器,在纯粹的语法水平,这两个看起来像:
DO <INT> <VAR>=...
DO <INT> <VAR>=...
<STMTS>
<INT> CONTINUE
<INT> CONTINUE
如何才能确定哪些CONTINUE语句属于哪个做的仅此信息consrtuct?你不能。
DMS FORTRAN解析器通过为DO循环提供两组规则来完成此操作,一个用于非共享连续,一个用于共享。他们使用语义谓词进行区分,检查CONTINUE语句标签是否与DO循环指定标签匹配。因此,DMS FORTRAN解析器在解析时获得循环嵌套权。 AFAIK,所有其他FORTRAN编译器分别解析这些语句,然后在DO后循环中将DO循环嵌套在一起。
是的,虽然FORTRAN有这个(令人困惑的)构造,但我没有其他现代语言复制它。
为什么这个问题专门针对ANTLR3? – 2012-04-10 07:07:05
@IraBaxter对不起,我想到了产品名称和版本是必要的,以回答的问题。我想知道ANTLR3就足够了,因为它可能在现场很受欢迎,而3是最新版本。 – 2012-04-10 07:14:30
您只需要提出具有相对精确的技术答案的问题。 “如何使用链表对代码进行编码?”应该是一个合理的SO问题,并且与特定的产品/工具/库无关。那么,涉及到这些问题,但如果实际神器是不是真正问题的问题,你的问题是不是简洁,你会为它遭受虐待。 – 2012-04-10 07:33:38