【发布时间】:2019-06-24 19:38:36
【问题描述】:
我正在编写自己的编程语言,并且在解决了大部分其他内容之后已经开始解析元组/lambda 表达式。语法与 C# 非常相似,但有一些细微差别。我想知道 C# 是否先行确定是否生成简单的带括号的表达式、元组或 lambda,这似乎不太可能,因为先行 (k) 是不确定的。
现在,我正在通过提前查看某些指标来破解解决方案,这些指标应该为解析器提供关于它试图解析的内容的线索。即检查标识符 @1,然后检查 @2 处的 '='、',' 或 ':'(冒号用于用类型信息注释标识符)。
我的 lambda 语法比 C# 中的语法更灵活一点,所以猜测一下,您可以只解析标识符列表,直到没有更多逗号,然后检查下 2 个标记是否有 ')' 和 '= >'。
有什么我遗漏的技巧吗?
【问题讨论】:
-
基本上,自定义前瞻。以this 为例。
-
是的,似乎是我遇到的问题:p 谢谢,很好的发现:)
-
有一个 LALR(1) 语法,我认为它类似于 this answer 中的 C# lambda 语法。我没有将其标记为重复,因为它不处理元组并且因为您说您想要的语法不同(没有说明它是什么),并且因为您没有明确说明您想要什么样的解析器建造。但也许答案还是有用的。
-
C# Roslyn compiler 是开源的。
-
@rici 我不相信它可以用 LALR(1) 语法来完成,你必须知道标识符后面是什么来确定它是否是一个普通的 ol' 表达式,lambda 参数列表等。所以充其量可能是 LALR(2)。