gpt4 book ai didi

c# - 解析器如何处理泛型类型参数?

转载 作者:行者123 更新时间:2023-11-30 14:44:55 25 4
gpt4 key购买 nike

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

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

someFunction<T>(x);

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

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

  • 使用通用参数“T”和常规参数“x”调用“someFunction”
  • 计算表达式“(someFunction < T) > x”,将“someFunction”、“T”和“x”视为常规变量

解析器如何知道要进行哪种解释?

最佳答案

您 100% 正确,通用函数调用语法在许多包含该功能的语言中是不明确的。

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

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

  • C++ 要求编译器确定函数/方法/类名称是否(或可能)模板化。 (ADL 使这有点棘手,在 C++18 中,规则更改为包括非模板化函数/方法名称可能仍被解释为模板化的情况。)

  • C# 要求编译器找到尖括号模板参数的末尾(如果可能),然后检查下一个输入标记;如果下一个标记是左括号或一组在语法上不能跟在 > 之后的标记之一(例如,一个分号),然后模板参数被这样处理;如果没有匹配 >或匹配 >后面跟着类似 42 的内容,然后将其作为比较处理。

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

据我所知,您可以自由地提出自己的不同解决方案。如果您希望其他人使用您的语言,我确实鼓励您完整而清楚地记录下来。 (例如,我找不到这样的 typescript 文档,我不使用它。)如果我正在设计一种带有泛型的语言,我想我会选择明确的语法。但这就是我。

关于c# - 解析器如何处理泛型类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56509848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com