Location via proxy:
[ UP ]
[Report a bug]
[Manage cookies]
No cookies
No scripts
No ads
No referrer
Show this form
Submit Search
Racc でおてがる構文解析
•
Download as ODP, PDF
•
4 likes
•
4,273 views
M
morphine57
Follow
Ruby/Rails 勉強会@関西第36回で発表したスライド。構文解析についてと、パーサージェネレーターRaccの基本的な使い方について
Read less
Read more
1 of 18
Download now
More Related Content
Racc でおてがる構文解析
1.
Racc でおてがる構文解析 まき
2.
自己紹介 よしおかまき
3.
id:morphine57(もるひねと読みます)
4.
プログラミング歴10年 初めてのプログラミングはCOBOLでした Ruby歴、気付けば5年
でもまだよく分かってない(汗
5.
本日の概要 構文解析とは コンパイラのしごと
6.
字句解析
7.
構文解析 Raccって? Raccの基本的な使い方
8.
構文ルール書き方
9.
デモ 質問
10.
構文解析とは 文字の羅列であるソースコードを機械が解釈できる形にすること
11.
コンパイラの仕事の一部
12.
コンパイラのしごと 広義の構文解析 &
今日の範囲 ソースコードをコンピュータやVMが実行できる命令語に変換すること 字句解析 構文解析 意味解析 コード生成
13.
字句解析 ソースコードの文字列をトークンと呼ばれる単位に分割する
14.
トークンは意味値を持つ 識別子、整数、文字列
15.
予約語やカッコに意味値はない hoge=(hoge+1)/2 =
( ) + hoge / 2 - - - - 識別子 - 整数 1 整数 ひとつの トークン 下段が意味値 hoge 識別子
16.
構文解析(狭義)(1) トークン列を解析して抽象構文木に変換する
17.
構文解析(狭義)(2) 1 +
hoge ÷ 2 右式 左式 演算式 演算子 演算子 右式 左式 = ( ) + hoge / 2 - - - - 識別子 - 整数 1 整数 hoge 識別子 演算式 代入式 右式 hoge 終端子 非終端子 (ノード)
18.
ここまでまとめ 字句解析 構文解析
((huge+1)÷2)×3 ( ( ) 1 + huge ÷ 2 3 × ) 右式 演算式 演算子 左式 代入式 右式 hoge
19.
Racc って? パーサージェネレータ
構文解析器(パーサー)のジェネレータ Racc = Ruby yACC Yacc = Yet Another Compiler Compiler 入手方法 gem
20.
RAA
21.
svn
22.
Raccの基本的な使い方(1) 拡張子yのファイルを書く 文法を記述
23.
「---- header」で require
など
24.
「---- inner」でクラスの中身、字句解析処理など
25.
「---- footer」で後処理 j_parser.y
class JapaneseParser rule end ---- header require 'node' ---- inner def parse ・・・ do_parse end ---- footer ・・・・ 文法 (後ほど解説 )
26.
Raccの基本的な使い方(2) パーサークラス生成 $racc
-o j_parser.rb j_parser.y
27.
指定した名前(上記例だとj_parser.rb)のRubyソースファイルができる(中身はmodule_evalの嵐)
28.
Raccの基本的な使い方(3) 使う 使い方一例
require 'j_parser' src = File.read(ARGV[0]) parser = JapaneseParser.new syntax_tree = parser.parse(src) ・・・・
29.
文法ルール書き方(1) 文法の並びは終端子、非終端子、文字列で表現する
30.
アクション 文法の並びにマッチした時の処理を記述
31.
valにマッチした配列が渡される
32.
resultにセットしたオブジェクトが上位の木からvalで参照できる 非終端子 :
文法の並び { アクション } | 上とは別の書き方がある場合同じように記述
33.
文法ルール書き方(2) (例) program
: {result = []} | program stmt { result ||= [] result << val[1]} stmt : assign EOL {result = StmtNode.new(val[0])} assign : IDENT '=' expr {result = AssignNode.new(val[0],val[2])} expr : IDENT {result = VariableNode.new(val[0])} | expr '+' expr {result = ArithmeticNode.new(val[0],val[2])} ・・・・・・
34.
文法ルール書き方(3) hoge=hoge+1 StmtNode
AssignNode hoge ArithmeticNode hoge + 1
35.
まとめ 構文解析ができると、ただの文字の羅列もとても扱いやすくなります
36.
おてがるです
37.
参考書籍 ふつうのコンパイラをつくろう
38.
Rubyを256倍使うための本 無道編
39.
Question? Q:それって正規表現でできるんじゃないの? A:とても難しくて面倒です。例えば条件のネスト(AND、OR)etc・・
Q:使いどころは? A: コンパイラを作りたい時ではなくても、規則性やルールのある文字の集合であれば解析できます
40.
私はソフトウェアのマイグレーションに使いました
Download