Ruby 关于表达式解析问题

dongli1985 · 2013年06月16日 · 最后由 bhuztez 回复于 2013年06月17日 · 3035 次阅读

大家好!我正在开发一个用于 Fortran 程序的编程工具,需要对 Fortran 进行解析。之前用了 Treetop,但是它的文档很稀少,而且很完全掌握,因此我想换用 Parslet,已经写了一些解析规则,放在了(https://gist.github.com/dongli/5791976)。

在解析表达式的时候遇到了一点问题,错误可以通过 gist 里的 rspec 脚步看到。希望对文本解析熟悉的同志帮帮忙。多谢!

expression 那几条规则有点乱啊... binary_operator? 放开头是什么功效?

无视优先级的话这样就可以了:

expression = expression_item (binary_operator expression)* | '(' expression ')'

是有点乱,因为有递归的成分。前面的 binary_operator 就是用于递归。今天试试你的方法。多谢!

@luikore 我试了你的规则,如下(不知道是否和你写的一致):

rule(:expression) {
    ( expression_item >> ( binary_operator >> expression ).repeat ) |
    bracketed(expression)
}

好像无法匹配((a+1)+b)/((c*2)-d),因为这个例子一开头是一个expression,而不是expression_item

@bhuztez f2py 是很不错的工作!不过我不太想用 Python~,我所要的是提取信息到 Ruby 中,我的工作在https://github.com/dongli/CodeMate

主要是用来编译 Fortran 工程,以及给 Fortran 提供高级的模版化功能,加入链表模版等。

@luikore 我修改了原来的sub_expressionexpression

rule(:sub_expression) {
    bracketed(expression_item >> ( binary_operator >> expression_item ).maybe, true) >>
    ( binary_operator >> expression ).maybe
}

rule(:expression) {
    bracketed(sub_expression >> ( binary_operator >> sub_expression ).maybe, true)
}

已经通过了目前的测试。

#5 楼 @dongli1985 你可以用 RubyPython 去调用么

需要 登录 后方可回复, 如果你还没有账号请 注册新账号