1

请问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;

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

非常感谢你。

4

1 回答 1

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

对比

     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 有这个(令人困惑的)结构,但我所知道的其他现代语言都没有复制它。

于 2012-04-10T07:22:14.620 回答