After RubyKaigi 2024 LR Parser Night w/ Asakusa.rb
Semantic actions
code:ruby
def_name : fname
{
ID fname = $1;
numparam_name(p, fname);
local_push(p, 0);
p->ctxt.in_def = 1;
p->ctxt.in_rescue = before_rescue;
$$ = $1;
}
;
こういうの。構文規則とアクションが一緒で、状態があったりして大変
Ohm
JSのライブラリとDSLで定義される構文解析ツールセット
なんとかLRを整理する
parser
Canonical LR
LALR
IELR
Scannerless Parser
PSLR
Parser に属するものの違いはオートマトンの作り方
Canonical LRは部分集合をマージしない
マージするのがLALR
状態数が減って嬉しいね
知らないコンフリクトがおきちゃうんだよね
このコンフリクトが起きないように色々やったんですよね、ってのがIELR
Lrama何が嬉しいの
named reference
作ったパーサーにいい感じの変数名がつけれるよ
inlining
Converting AST
RUby3.4でやっていくよいってはなしてた Prism互換インターフェースのはなし
ast_to_prism
互換レイヤーを作るには差分を知る必要がある
特に足りない方
ドキュメント書いてたんだけど、ねえ?
RubyVM::AST::Node からPrism::Node に変換する君
RubyVM::AST::NodeにはPrism::Nodeにはないメタ情報がそこそこあるぽい
とか
code:ruby
begin
1
rescue
2
else
3
ensure
4
end
code:ruby
irb(main):079" r = <<~RUBY
irb(main):080" begin
irb(main):081" 1
irb(main):082" rescue
irb(main):083" 2
irb(main):084" ensure
irb(main):085" 3
irb(main):086" end
irb(main):087> RUBY
=> "begin\n1\nrescue\n2\nensure\n3\nend\n"
irb(main):088> ast = RubyVM::AbstractSyntaxTree.parse(r)
=> (SCOPE@1:0-7:3 tbl: [] args: nil body: (ENSURE@2:0-6:1 (RESCUE@2:0-4:1 (LIT@2:0-2:1 1) (RESBODY@3:0-4:1 nil (LIT@4:0-4:1 2) nil) nil) (LIT@6:0-6:1 3)))
irb(main):089> pp ast
(SCOPE@1:0-7:3 tbl: [] args: nil body: (ENSURE@2:0-6:1 (RESCUE@2:0-4:1 (LIT@2:0-2:1 1) (RESBODY@3:0-4:1 nil (LIT@4:0-4:1 2) nil) nil) (LIT@6:0-6:1 3)))
=> (SCOPE@1:0-7:3 tbl: [] args: nil body: (ENSURE@2:0-6:1 (RESCUE@2:0-4:1 (LIT@2:0-2:1 1) (RESBODY@3:0-4:1 nil (LIT@4:0-4:1 2) nil) nil) (LIT@6:0-6:1 3)))
irb(main):090> pretty_print_ast ast
RubyVM::AbstractSyntaxTree::Node: SCOPE
[]
nil
RubyVM::AbstractSyntaxTree::Node: ENSURE
RubyVM::AbstractSyntaxTree::Node: RESCUE
RubyVM::AbstractSyntaxTree::Node: LIT
1
RubyVM::AbstractSyntaxTree::Node: RESBODY
nil
RubyVM::AbstractSyntaxTree::Node: LIT
2
nil
nil
RubyVM::AbstractSyntaxTree::Node: LIT
3
=> [[], nil, (ENSURE@2:0-6:1 (RESCUE@2:0-4:1 (LIT@2:0-2:1 1) (RESBODY@3:0-4:1 nil (LIT@4:0-4:1 2) nil) nil) (LIT@6:0-6:1 3))]
とか書くとRubyVM::AST::Nodeの構造が結構きたない(かつての制約のせい)。ENSUREが一番外側にいてウケる
Prismはきれい〜。
code:ruby
1+2
undef :a, :b
3.4
っもきたない
VS the Worldのコーナー
Lramaが他のプロダクトでも使われるための展望はありそう?
できるっちゃできるけど、まずはRuby
Bison 潰すってことはできているのでできないことはないと思うが