Mais conteúdo relacionado Semelhante a Goで言語処理系(の途中まで)を作ろう (20) Goで言語処理系(の途中まで)を作ろう21. How to Create Your Own
Programming Language
http://createyourproglang.com/
26. 例: Haskell 2010 Language Report
literal -> integer | float | char | string
digit -> ascDigit | uniDigit
ascDigit -> 0 | 1 | … | 9
uniDigit -> any Unicode descimal decit
decimal -> digit{digit}
integer -> decimal
38. 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)
};
….
40. 文字の規則とトークン
# ---- Literal ---string = ("'" . (any - "'")* . "'")
|('"' . (any - '"')* . '"');
integer = digit+;
atom = (alpha (alpha | digit)* );
# ---- Operator ---operator = "+" | "-" | "*" | "/";
42. トークンの処理
main := |*
atom => {
material := Ore{
Token: ATOM,
Value: data[ts:te],
}
material.Research()
ores = append(ores, material)
};
48. go tool yacc
Yacc is a version of yacc for Go.
It is written in Go and generates parsers written in Go.
(公式より)
50. go yaccの書きかた
%type <val> ATOM, STRING, OPERATOR, BINDER, DEFINE
%type <val> ARG
%type <val> action, Expression
%type <values> StringExpression, AtomExpression
%%
%{
package casting
import (
"fmt"
"..
/miner"
)
%}
%union {
tok int
val interface{}
values Val
box Box
}
%token ATOM STRING
%token ARG
%token OPERATOR BINDER DEFINE
%token ROUNDPAREN_O ROUNDPAREN_C
action:
ATOM {
var v Value
v = Box{Type: ATOM, Value: $1,}
yylex.(*lex).NewBox(v)
}
| Expression {
if val, ok := $1.(Val); ok {
yylex.(*lex).root = val
}
}
...
55. 対応させましょう
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]
}
58. トークンの型定義
%union {
tok int
val interface{}
values Val
box Box
}
%type <val> ATOM, STRING, OPERATOR, BINDER,
DEFINE
%type <val> ARG
%type <val> action, Expression
%type <values> StringExpression, AtomExpression