请问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;
让我问一下这种语法是否有时或很少用于计算机语言。
非常感谢你。
请问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;
让我问一下这种语法是否有时或很少用于计算机语言。
非常感谢你。
一般来说,解析器(由解析器生成器生成)只检查语法。
可以探索多个解析的解析器(以任何方式产生)(我相信 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 有这个(令人困惑的)结构,但我所知道的其他现代语言都没有复制它。