Goで言語処理系(の途中まで)を作ろう
-
Upload
esehara-shigeo -
Category
Technology
-
view
2.171 -
download
8
Transcript of Goで言語処理系(の途中まで)を作ろう
Lispが持つ病
1. 関数型言語カッコイイ!2. 関数型言語の元祖といえばLisp!カッ
コイイ!(括弧なだけに)
3. コンピューターサイエンス、Artifact Intelligenceの分野でも活躍!Awesome!
4. Lispが使いこなせると構文木も自由自在!
C言語が持つ病
1. 「Lightweight Languageって所詮富豪プログラミングだよねー」
2. 「Lightweight Languageって所詮ポインタとかメモリアドレスとか知らないんでしょ」
3. 「Lightweight Languageってコンパイルのこととか所詮わからないんでしょ」
How to Create Your Own Programming Language
http://createyourproglang.com/
例: Haskell 2010 Language Report
literal -> integer | float | char | stringdigit -> ascDigit | uniDigitascDigit -> 0 | 1 | … | 9uniDigit -> any Unicode descimal decitdecimal -> digit{digit}integer -> decimal
使える
http://www.oki-osk.jp/esc/golang/lisp.html
Ragel compiles executable finite state machines from regular languages. Ragel targets C, C++, Objective-
C, C#, D, Java, Ruby,
OCaml and Go.
Ragelの書きかた
# ---- Literal ----string = ("'" . (any - "'")* . "'") |('"' . (any - '"')* . '"');integer = digit+;atom = (alpha (alpha | digit)* );# ---- Operator ----operator = "+" | "-" | "*" | "/";
main := |*atom => {material := Ore{ Token: ATOM, Value: data[ts:te], }material.Research()ores = append(ores, material) };
String => {material := Ore{Token: STRING,Value: data[ts:te],}material.Research()ores = append(ores, material)};
….
文字の規則とトークン
# ---- Literal ----string = ("'" . (any - "'")* . "'") |('"' . (any - '"')* . '"');integer = digit+;atom = (alpha (alpha | digit)* );# ---- Operator ----operator = "+" | "-" | "*" | "/";
トークンの処理
main := |*atom => {
material := Ore{ Token: ATOM, Value: data[ts:te], }material.Research()ores = append(ores, material) };
トークンの定義
const( //Special Token ILLEGAL Token = iota EOF COMMENT
begin_define_literal ATOM STRING INTEGER end_define_literal ………)
参考: go/token
go tool yaccYacc is a version of yacc for Go.
It is written in Go and generates parsers written in Go.(公式より)
go yaccの書きかた
%{package casting
import ("fmt"
"../miner")%}%union {tok intval interface{}values Valbox Box}
%token ATOM STRING%token ARG%token OPERATOR BINDER DEFINE%token ROUNDPAREN_O ROUNDPAREN_C
%type <val> ATOM, STRING, OPERATOR, BINDER, DEFINE%type <val> ARG%type <val> action, Expression%type <values> StringExpression, AtomExpression%%
action:ATOM {var v Valuev = Box{Type: ATOM, Value: $1,}
yylex.(*lex).NewBox(v) }| Expression {if val, ok := $1.(Val); ok {yylex.(*lex).root = val}}...
利用するトークンの定義
%token ATOM STRING%token ARG%token OPERATOR %token BINDER DEFINE%token ROUNDPAREN_O ROUNDPAREN_C
対応させましょう
var oretokens = [...]int {miner.ATOM: ATOM,miner.STRING: STRING,miner.OPERATOR: OPERATOR,miner.BINDER: BINDER,miner.ROUNDPAREN_O: ROUNDPAREN_O,miner.ROUNDPAREN_C: ROUNDPAREN_C,}
func toToken(ore miner.Ore) int {return oretokens[ore.Token]}
トークンの型定義%union {tok intval interface{}values Valbox Box}
%type <val> ATOM, STRING, OPERATOR, BINDER, DEFINE%type <val> ARG%type <val> action, Expression%type <values> StringExpression, AtomExpression
抽象構文木とは
http://en.wikipedia.org/wiki/Abstract_syntax_tree
go/astPackage ast declares the types used to represent
syntax trees for Go packages. (公式より)※実はPythonにも標準パッケージとしてあります
関数宣言の管理とGlobal Environment
http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/
トークンの型定義
type Env interface{}type envs []Envvar environment envs
type EnvValue struct {Name stringVal Env}
func AccessEnv() *envs {return &environment}
https://github.com/esehara/Perid