首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析器如何处理泛型类型参数?

解析器如何处理泛型类型参数?
EN

Stack Overflow用户
提问于 2019-06-08 20:21:39
回答 1查看 455关注 0票数 4

我正在为一种虚构的编程语言编写一个递归的、体面的解析器。它是一种C风格的语言,具有==、<、>、<=和>=等常见运算符,它还具有泛型函数(如C#中的函数)。

在像C#这样的语言中,要调用泛型函数,您可以编写:

代码语言:javascript
运行
复制
someFunction<T>(x);

我的问题是,解析器如何区分泛型参数和比较运算符(<和>)。

在我看来,上面的代码可能有以下两种含义之一:

  • 使用泛型参数'T‘和常规参数'x’调用'someFunction‘
  • 求表达式'(someFunction < T) > x',将'someFunction‘、'T’和'x‘作为正则变量

解析器如何知道哪种解释是有意的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-10 01:47:44

在包含此功能的许多语言中,泛型函数调用语法是不明确的,这是100%正确的。

并非所有语言都使用模糊语法。在Java中,没有歧义,因为类型参数放在方法名称之前,并且必须前面有一个.SomeClass.<ArgType>genericMethod()。其他可能性包括对类型括号使用不同的符号,如[]::<>!。(Scala,Rust,D.)) Scala对数组下标使用括号。)

但是许多语言确实使用了C++/C#语法,这是不明确的。每一种语言都有自己的消歧规则,据我所知,在如何做到这一点上没有跨语言共识。特别是:

  • C++要求编译器确定函数/方法/类名是否是模板化的(或可能是模板的)。(ADL使得这有点棘手,在C++18中,规则更改为包含这样一种情况,即非模板化的函数/方法名称可能仍然被解释为模板化。)
  • C#要求编译器在可能的情况下找到带角括号的模板参数的结尾,然后检查下一个输入令牌;如果下一个令牌是一个开括号或一组不能语法上跟随> (例如分号)的标记之一,那么模板参数将按这样的方式处理;如果没有匹配的>,或者匹配的>后面跟着类似42的东西,则作为比较处理它。

据我所见,使用C#定义的递归下降解析器需要能够回溯。另一方面,C++定义要求将名称解析与语法分析交织在一起,这是一种不同的丑陋。

据我所见,你可以自由地想出你自己的不同解决方案。如果你希望别人使用你的语言,我鼓励你把它完整而清晰地记录下来。(例如,我找不到打字本这样的文档,我不使用。)如果我设计一种带有泛型的语言,我想我会选择一个明确的语法。但只有我一个人。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56509848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档