首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ruby interperter如何解析双引号字符串?

ruby interperter如何解析双引号字符串?
EN

Stack Overflow用户
提问于 2014-01-30 23:00:06
回答 5查看 243关注 0票数 4

背景

我正在实现一种类似于Ruby的语言,作为一种在编程语言中尝试一些关于并发性的想法的方法。我试图用嵌入式代码复制Ruby的双引号字符串,作为一个程序员,这是非常有用的。

问题

任何Ruby解释器如何将带有嵌入式代码的双引号字符串转换为和AST?

例:

代码语言:javascript
代码运行次数:0
运行
复制
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。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-30 23:28:31

诚然,雅克文件一开始读起来可能有点让人望而生畏,而parse.y并不是最好的文件。您看过各种字符串产生规则吗?你有什么特别的问题吗?

至于实际的解析,确实并不少见的是,词汇者也会解析数字文字和字符串,例如,请参见此处接受的相似问题答案。如果你以这种方式处理事情,就不难看出如何去做。点击字符串中的#{,基本上会启动一个新的解析上下文,该上下文再次被解析为表达式。这意味着您的示例中的第一个}不能是内插的终止},因为它是表达式中文字字符串的一部分。一旦您到达表达式的末尾(请记住表达式分隔符,如;),下一个}就是您所需要的。

票数 2
EN

Stack Overflow用户

发布于 2014-01-31 00:57:24

这不是一个完整的答案,但我希望它对我或跟踪我的人都有帮助。

Matz在他的书的第11章中给出了parse.yparse.y函数的详细描述。它没有直接提到字符串,但它描述了lexer如何使用lex_state来解析Ruby中的几个本地模糊结构。

这一章的英文译文的复制品可以找到这里

票数 1
EN

Stack Overflow用户

发布于 2014-02-01 18:26:11

Dart还支持插入到字符串中的表达式,比如Ruby,我已经为它略读了几个解析器。我相信他们所做的是为字符串文本在插值之前定义单独的标记,并在末尾定义字符串文本。所以如果你标记:

代码语言:javascript
代码运行次数:0
运行
复制
"before ${the + expression} after"

你会得到这样的代币:

代码语言:javascript
代码运行次数:0
运行
复制
STRING_START "before "
IDENTIFIER   the
PLUS
IDENTIFIER   expression
STRING       " after"

然后,在解析器中,处理STRING_START以解析后面的插值表达式是一个非常简单的过程。

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

https://stackoverflow.com/questions/21469239

复制
相关文章

相似问题

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