【发布时间】:2014-01-30 23:00:06
【问题描述】:
背景:
我正在实现一种类似于 Ruby 的语言called Sapphire,以此来尝试我对编程语言并发性的一些想法。我正在尝试使用嵌入式代码复制 Ruby 的双引号字符串,我觉得这对程序员非常有用。
问题:
任何 Ruby 解释器如何将带有嵌入代码的双引号字符串转换为 AST?
例如:
puts "The value of foo is #{@foo}."
puts "this is an example of unmatched braces in code: #{ foo.go('}') }"
详情:
我遇到的问题是如何确定哪个} 关闭了代码块。代码块中可以有其他大括号,只要稍加努力,它们就可以无与伦比。词法分析器可以在字符串中找到代码块的开头,但没有解析器的帮助,它无法确定哪个字符是该块的结尾。
它看起来像 Ruby 的 parse.y 文件同时执行词法分析和解析步骤,但 reading that thing is a nightmare 它有 11628 行长,没有 cmets 和很多缩写。
【问题讨论】:
-
另外,字符串文字必须解决一个类似的棘手问题:
%Q{{hi}} #=> "{hi}" -
Alex,如果你把它输入到 IRB 中,你的例子会报错。 Ruby 将在第一个右大括号上结束字符串。这就是为什么你可以在这个结构中选择你的符号。即 %Q|{hi}|打开构造的符号就是关闭它的符号。例外情况是 {[()]} 关闭。
-
Michael:heredocs 很简单。开始符号 cannot 出现在行首,除了它关闭heredoc。如果您找到终止符号,则它必须是结尾。
-
在 pry(另一个 repl)中,它没有显示任何错误,也不应该显示任何错误。我提出了这个要点,因为我无法轻易解释:gist.github.com/nedzadarek/8744476 在 Ruby 版本 1.9.3 和 2.0 上进行了测试
-
对于heredocs,结束符号必须单独出现在新行中,不能有任何其他字符。其他出现的 symbol 都是有效的。所以考虑到
ST是 symbolST(见ST后面的空格)不会关闭heredoc。 2. 有一种特殊的语法:var1=<<-ST,可以让你在终止字符串之前放置空格(`ST` 是有效的)。 3. heredocs 可以出现多次,a,b=<<S,<<S是 heredocs 的第一行有效。
标签: ruby parsing language-design lexer