背景
我正在实现一种类似于Ruby的语言,作为一种在编程语言中尝试一些关于并发性的想法的方法。我试图用嵌入式代码复制Ruby的双引号字符串,作为一个程序员,这是非常有用的。
问题
任何Ruby解释器如何将带有嵌入式代码的双引号字符串转换为和AST?
例:
puts "The value of foo is #{@foo}."
puts "this is an example of unmatched braces in code: #{ foo.go('}') }"
详细信息
我遇到的问题是如何决定哪个}
关闭代码块。代码块可以有其他大括号,只要稍加努力,它们就可以是无与伦比的。lexer可以在字符串中找到代码块的开头,但是如果没有解析器的帮助,它就无法确定哪个字符是该块的末尾。
看起来Ruby的parse.y
文件同时执行了词法和解析步骤,但是读那东西是一场噩梦它有11628行长,没有注释和大量的abbr。
发布于 2014-01-30 15:28:31
发布于 2014-01-30 16:57:24
这不是一个完整的答案,但我希望它对我或跟踪我的人都有帮助。
Matz在他的书的第11章中给出了parse.y
的parse.y
函数的详细描述。它没有直接提到字符串,但它描述了lexer如何使用lex_state
来解析Ruby中的几个本地模糊结构。
这一章的英文译文的复制品可以找到这里。
发布于 2014-02-01 10:26:11
Dart还支持插入到字符串中的表达式,比如Ruby,我已经为它略读了几个解析器。我相信他们所做的是为字符串文本在插值之前定义单独的标记,并在末尾定义字符串文本。所以如果你标记:
"before ${the + expression} after"
你会得到这样的代币:
STRING_START "before "
IDENTIFIER the
PLUS
IDENTIFIER expression
STRING " after"
然后,在解析器中,处理STRING_START
以解析后面的插值表达式是一个非常简单的过程。
https://stackoverflow.com/questions/21469239
复制