3

我目前正在寻找一个允许我解析 ruby​​ 代码并将代码转换为具体语法树的框架。

我看过Rubyparser,这是我感兴趣的方向,但它给了我一个抽象语法树。

另一种方法是拆开一个构建 CST 的工具(可能是 Pelusa 或类似的东西)。

你有什么建议吗?它应该是用 Ruby 编写的,所以我不能使用原始的 Ruby 解析器。

4

1 回答 1

3

我不确定你到底想做什么,但看看Treetop,它会让你定义一个语法文件,并将语法编译成 Ruby 中的解析器。它是一个 PEG 解析器,因此它也比传统的 LALR 解析器更容易使用。

这是一个解析一点 Ruby 的示例(当然,您必须扩展语法以满足您的需求,这可能很困难,因为 Ruby 解析起来相当复杂):

require 'treetop'
Treetop.load_from_string DATA.read

parser = TestParser.new

p parser.parse('def func
   6 + 5
end')

__END__
grammar Test
   rule function
      'def' space function_name function_body 'end'
   end
   rule function_name
      [A-Za-z]+
   end
   rule function_body
      space expression space
   end
   rule expression
      '6 + 5'
   end
   rule space
      [\t \n]+
   end
end

解析这个返回一个 AST:

SyntaxNode+Function0 offset=0, "...ef func\n   6 + 5\nend" (space,function_name,function_body):
  SyntaxNode offset=0, "def"
  SyntaxNode offset=3, " ":
    SyntaxNode offset=3, " "
  SyntaxNode offset=4, "func":
    SyntaxNode offset=4, "f"
    SyntaxNode offset=5, "u"
    SyntaxNode offset=6, "n"
    SyntaxNode offset=7, "c"
  SyntaxNode+FunctionBody0 offset=8, "\n   6 + 5\n" (space1,expression,space2):
    SyntaxNode offset=8, "\n   ":
      SyntaxNode offset=8, "\n"
      SyntaxNode offset=9, " "
      SyntaxNode offset=10, " "
      SyntaxNode offset=11, " "
    SyntaxNode offset=12, "6 + 5"
    SyntaxNode offset=17, "\n":
      SyntaxNode offset=17, "\n"
  SyntaxNode offset=18, "end"

tt此外,您可以使用命令行工具将树顶语法文件编译为 Ruby 代码。

tt test.treetop -o test-treetop.rb
于 2012-10-09T14:43:58.167 回答