我目前正在寻找一个允许我解析 ruby 代码并将代码转换为具体语法树的框架。
我看过Rubyparser,这是我感兴趣的方向,但它给了我一个抽象语法树。
另一种方法是拆开一个构建 CST 的工具(可能是 Pelusa 或类似的东西)。
你有什么建议吗?它应该是用 Ruby 编写的,所以我不能使用原始的 Ruby 解析器。
我目前正在寻找一个允许我解析 ruby 代码并将代码转换为具体语法树的框架。
我看过Rubyparser,这是我感兴趣的方向,但它给了我一个抽象语法树。
另一种方法是拆开一个构建 CST 的工具(可能是 Pelusa 或类似的东西)。
你有什么建议吗?它应该是用 Ruby 编写的,所以我不能使用原始的 Ruby 解析器。
我不确定你到底想做什么,但看看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