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; 

让我问一下这样的语法是否有时或很少用于计算机语言。

非常感谢。

+0

为什么这个问题专门针对ANTLR3? – 2012-04-10 07:07:05

+0

@IraBaxter对不起,我想到了产品名称和版本是必要的,以回答的问题。我想知道ANTLR3就足够了,因为它可能在现场很受欢迎,而3是最新版本。 – 2012-04-10 07:14:30

+0

您只需要提出具有相对精确的技术答案的问题。 “如何使用链表对代码进行编码?”应该是一个合理的SO问题,并且与特定的产品/工具/库无关。那么,涉及到这些问题,但如果实际神器是不是真正问题的问题,你的问题是不是简洁,你会为它遭受虐待。 – 2012-04-10 07:33:38

通常,解析器(由解析器生成器生成)仅检查语法。 (我相信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有这个(令人困惑的)构造,但我没有其他现代语言复制它。