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