大家好!我正在开发一个用于 Fortran 程序的编程工具,需要对 Fortran 进行解析。之前用了 Treetop,但是它的文档很稀少,而且很完全掌握,因此我想换用 Parslet,已经写了一些解析规则,放在了(https://gist.github.com/dongli/5791976)。
在解析表达式的时候遇到了一点问题,错误可以通过 gist 里的 rspec 脚步看到。希望对文本解析熟悉的同志帮帮忙。多谢!
expression 那几条规则有点乱啊... binary_operator? 放开头是什么功效?
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。
((a+1)+b)/((c*2)-d)
expression
expression_item
https://code.google.com/p/f2py/
@bhuztez f2py 是很不错的工作!不过我不太想用 Python~,我所要的是提取信息到 Ruby 中,我的工作在https://github.com/dongli/CodeMate,
主要是用来编译 Fortran 工程,以及给 Fortran 提供高级的模版化功能,加入链表模版等。
@luikore 我修改了原来的sub_expression和expression:
sub_expression
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 去调用么