我正在为一种虚构的编程语言编写一个递归的、体面的解析器。它是一种C风格的语言,具有==、<、>、<=和>=等常见运算符,它还具有泛型函数(如C#中的函数)。
在像C#这样的语言中,要调用泛型函数,您可以编写:
someFunction<T>(x);
我的问题是,解析器如何区分泛型参数和比较运算符(<和>)。
在我看来,上面的代码可能有以下两种含义之一:
解析器如何知道哪种解释是有意的?
发布于 2019-06-10 01:47:44
在包含此功能的许多语言中,泛型函数调用语法是不明确的,这是100%正确的。
并非所有语言都使用模糊语法。在Java中,没有歧义,因为类型参数放在方法名称之前,并且必须前面有一个.
:SomeClass.<ArgType>genericMethod()
。其他可能性包括对类型括号使用不同的符号,如[]
、::<>
或!
。(Scala,Rust,D.)) Scala对数组下标使用括号。)
但是许多语言确实使用了C++/C#语法,这是不明确的。每一种语言都有自己的消歧规则,据我所知,在如何做到这一点上没有跨语言共识。特别是:
>
(例如分号)的标记之一,那么模板参数将按这样的方式处理;如果没有匹配的>
,或者匹配的>
后面跟着类似42
的东西,则作为比较处理它。据我所见,使用C#定义的递归下降解析器需要能够回溯。另一方面,C++定义要求将名称解析与语法分析交织在一起,这是一种不同的丑陋。
据我所见,你可以自由地想出你自己的不同解决方案。如果你希望别人使用你的语言,我鼓励你把它完整而清晰地记录下来。(例如,我找不到打字本这样的文档,我不使用。)如果我设计一种带有泛型的语言,我想我会选择一个明确的语法。但只有我一个人。
https://stackoverflow.com/questions/56509848
复制相似问题