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
Top Related