antlr可以进行类型相关的解析吗?

antlr可以进行类型相关的解析吗?,antlr,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; 让我问一下,这些语法是否有时或很少用于计算机语言 非常感谢。通常,解析器(由解析器生成器生成)只检查语法 可以探索多个解析的解

让我问一下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可以检查语义谓词。另一个问题是,通过语义检查获取您所讨论的类型信息有多容易;我在这里没有经验

我们使用的GLR解析引擎确实有“语义”谓词。通过体系结构设计,向这些谓词获取真正的语义类型信息并不特别容易;我们希望将这些谓词从“语法”中剔除。但是,所有东西(包括类型推断)都脱离了语法。因此,我们将信息完全局限于提议的减排。这对于(而不是)将嵌套do终止与共享do终止的以下特殊FORTRAN结构识别为单独的解析类型特别方便:

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

对于解析器来说,在纯语法级别上,这两种语言看起来都像:

  DO <INT>  <VAR>=...
        DO <INT> <VAR>=...
           <STMTS>
  <INT> CONTINUE
  <INT> CONTINUE
DO=。。。
DO=。。。
继续
继续
如何确定哪条CONTINUE语句属于哪条CONSTRUCT语句?你不能

DMS FORTRAN解析器正是通过为DO循环提供两组规则来实现这一点的,一组用于非共享continues,一组用于共享continues。它们使用语义谓词进行区分,语义谓词检查CONTINUE语句标签是否与DO循环指定的标签匹配。因此,DMS FORTRAN解析器在解析时正确地进行循环嵌套。好了,所有其他FORTRAN编译器都单独解析语句,然后在post过程中将DO循环嵌套缝合在一起


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

为什么这个问题是专门针对ANTLR3的?@IraBaxter,我很抱歉。我认为回答问题需要产品名称和版本。我认为了解ANTLR3就足够了。因为它可能在这个领域很流行,而且3是最新的版本。你只需要问一些有相对精确的技术答案的问题。“如何使用链表编码堆栈?”应该是一个合理的SO问题,与特定的产品/工具/库无关。问题也与这些相关,但是如果实际的工件不是问题的主题,那么你的问题就不简洁,你会因此而遭受虐待。
  DO <INT>  <VAR>=...
        DO <INT> <VAR>=...
           <STMTS>
  <INT> CONTINUE
  <INT> CONTINUE