antlr可以进行类型依赖的解析吗?

时间:2012-04-10 06:50:21

标签: antlr

让我问一下antlr3是否接受以下示例语法。

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;

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

非常感谢。

1 个答案:

答案 0 :(得分:3)

通常,解析器(由解析器生成器生成)仅检查语法

可以探索多个解析的解析器(通过任何方式生成)(我相信ANTLR通过回溯来实现这一点;其他解析引擎[GLR,Earley]通过并行探索可能的解析来实现),如果使用语义检查信息进行扩充,可以拒绝那些不符合语义约束的解析。

人们往往不会根据我的经验构建这样的解析器,部分原因是很难向用户解释。如果他们没有得到它,你的解析器就不会成功;你的例子在解释性方面尤其糟糕恕我直言。他们也倾向于不这样做,因为他们需要那些类型信息,并且在解析时收集并不总是方便。 GCC解析器就是这样做来解析诸如

之类的语句
   X*T;

并且解析器有点混乱,因为需要解析并收集此类型的信息。

我怀疑ANTLR可以检查语义谓词。获取与那些语义检查讨论的类型信息是多么容易是另一个问题;我没有经验。

我们的DMS Software Reengineering Toolkit使用的GLR解析引擎确实具有“语义”谓词。通过架构设计获得真实的语义类型信息对于那些谓词并不是特别容易;我们希望这些谓词能够脱离“语法”。但是,一切(包括类型推断)都会被语法驱逐。因此,我们将信息纯粹局限于所提议的减少。这特别方便(不)识别为单独类型的解析,以下特殊的FORTRAN构造用于嵌套终止与共享终止:

     DO 10  I=1,10,1
        DO 10 J=1,10,1
           A(I,J)=0
 10 CONTINUE
 20 CONTINUE

VS

     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语句属于哪个DO只包含此信息?你不能。

DMS FORTRAN解析器通过为DO循环提供两组规则来完成此操作,一组用于非共享继续,一组用于共享继续。它们使用语义谓词来区分,该语义谓词检查CONTINUE语句标签是否与DO循环指定标签匹配。因此,DMS FORTRAN解析器在解析时获得正确的循环嵌套。 AFAIK,所有其他FORTRAN编译器单独解析语句,然后在后传递中将DO循环嵌套在一起。

是的,虽然FORTRAN有这个(令人困惑的)构造,但我所知道的其他任何现代语言都没有复制它。

相关问题