More than 5 years have passed since last update.
goyaccã䜿ã
goã«ã¯ã³ã³ãã€ã©ä»¥å€ã«ãããã€ã䟿å©ãªããŒã«ãã€ããŠããŠããŠãgoyaccããã®äžã€ã ãyaccã¯ããŒãµãŒãžã§ãã¬ãŒã¿ã§ãããã°ã©ãã³ã°èšèªã¿ãããªèšèªãèªã¿åãããã®ããã°ã©ã ãçæããŠããããgoyaccã¯ãã®GoèšèªããŒãžã§ã³ãšãªã£ãŠããã
ãã®æç« ã§ã¯ãç°¡åãªèšèªãåŠçããããã°ã©ã ãäœããªãããgoyaccãçšããæ§æè§£æã®æ¹æ³ã«ã€ããŠèª¬æããã
ããã°ã©ã å šäœã¯draftcode/goyacc_sampleã§åç §ã§ãããæç« äžã§ã¯æç²ããèŒããªãã®ã§ãè¶³ããªãéšåã¯ãã¡ããã¿ãŠè£ã£ãŠæ¬²ããã
çæããèšèª
å®éã«åå¥è§£æåšãæ§æè§£æåšãäœããªãã説æãããããç°¡åãªèšç®æ©ã®ãããªãã®ãäœãããšã«ããããäœãèšèªã¯æ¬¡ã®ãããªæ§æãæã€èšèªã ã
var a = 123;
var b = a + 1;
a * (b + 2 * a);
åå¥è§£æåš
åå¥è§£æåšã¯ãæååãšããŠã®ãœãŒã¹ã³ãŒãããããŒã¯ã³åãšããŠã®ãœãŒã¹ã³ãŒããžå€æããããã°ã©ã ã ã
ããã°ã©ã ã®ãœãŒã¹ã³ãŒãã«åºãŠããåèªã¯ãããã€ãã®çš®é¡ã«åãããããäŸãã°ããã§äœãèšèªã«åºãŠããåèªã¯ã次ã®ã©ããã«åé¡ãããã
- ããŒã¯ãŒã
VAR - èå¥å
IDENT - æ°å€ãªãã©ã«
NUMBER - 代å
¥æŒç®å
'=' - çµç«¯å
';' - éãæ¬åŒ§ã»éãæ¬åŒ§
'(',')' - ååæŒç®ã®èšå·
'+','-','*','/'
åå¥è§£æåšã¯ããœãŒã¹ã³ãŒããåèªã«åå²ããŠãåé¡åãããŠåºåãããããªããã°ã©ã ã ãããã§ã¯åé¡ãããçš®é¡ã®ããšãããŒã¯ã³ãšåŒã¶ãåå¥è§£æåšã¯å ã®ãµã³ãã«ãœãŒã¹ãè§£æããæ¬¡ã®ãããªããŒã¯ã³ã®åãåºåããã
[VAR, IDENT, '=', NUMBER, ';', ...]
goã«ã¯æ§æè§£æåšãçæããããŒã«ã¯ã€ããŠããããåå¥è§£æåšãçæããããŒã«ã¯ã€ããŠããªãããã®ãããåå¥è§£æåšã¯ä»ã®æ¹æ³ã§äœãå¿ èŠããããåå¥è§£æåšã¯ææžãã§ãããŸãèŠåŽããã«äœãããæ¬¡ã«ãlexer.goããæç²ããåå¥è§£æåšã瀺ãã
type Scanner struct {
src []rune
offset int
lineHead int
line int
}
func (s *Scanner) scanIdentifier() string {
var ret []rune
for isLetter(s.peek()) || isDigit(s.peek()) {
ret = append(ret, s.peek())
s.next()
}
return string(ret)
}
func (s *Scanner) Scan() (tok int, lit string, pos Position) {
s.skipWhiteSpace()
pos = s.position()
switch ch := s.peek(); {
case isLetter(ch):
lit = s.scanIdentifier()
if keyword, ok := keywords[lit]; ok {
tok = keyword
} else {
tok = IDENT
}
case isDigit(ch):
tok, lit = NUMBER, s.scanNumber()
default:
switch ch {
case -1:
tok = EOF
case '(', ')', ';', '+', '-', '*', '/', '%', '=':
tok = int(ch)
lit = string(ch)
}
s.next()
}
return
}
åå¥è§£æåšScanner.Scanã¯ããŒã¯ã³ãè¿ããããã«ããŒã¯ã³ã«å ããŠããã®ããŒã¯ã³ã®ããšããšã®æååãšããŠã®è¡šçŸã§ãããªãã©ã«ãšãããŒã¯ã³ããã¡ã€ã«ã®ã©ã®äœçœ®ããå§ãŸã£ãã®ããšããæ
å ±ãäžç·ã«è¿ããŠããã
Scanner.Scanã¯ãŸããScanner.peekã§çŸåšã®å
é ã®æåãèŠãŠããããã¢ã«ãã¡ãããã ã£ããèå¥åãšããŠèªã¿èŸŒã¿ãæ°åã ã£ããæ°å€ãšããŠèªã¿èŸŒã¿ããã以å€ã§ããã°èšå·ãšããŠèªã¿åã£ãŠãããäžæåèªã¿çµãã£ããScanner.nextã§æ¬¡ã®æåãžé²ããŠããã
ããŒã¯ãŒãã®èªã¿èŸŒã¿æ¹
èå¥åãèªã¿èŸŒããšããã«çç®ãããããã§ã¯ãæ®éã«Scanner.scanIdentifierã§èå¥åãèªã¿èŸŒãã åŸã«ãå°ã倿Žãå ããŠãããããã°ã©ãã³ã°èšèªã§ã¯èå¥åãšããŒã¯ãŒãã¯åºå¥ããããããŒã¯ãŒããšã¯ãèå¥åã®äžã§ãç¹å¥æ±ãããããããªåèªã§ãããäŸãã°JavaScriptã§ã¯functionãªã©ã該åœãããç¹å¥æ±ãããããã«ãç¹å¥æ±ãããåèªã®ãªã¹ãkeywordsãçšæããŠãããããã«è©²åœããŠããå Žåã¯ãå¥ã®ããŒã¯ã³ãšããŠèªèãããããã«ããŠããã
èšå·ã衚ã宿°
ããŒã¯ãŒããèå¥åãªã©ã¯ããã¡ããšããã衚ãããã®å®æ°VARãIDENTãªã©ãå®çŸ©ããŠããããèšå·ã«ã€ããŠã¯å®æ°å®çŸ©ããµãã£ãŠããŠãruneãç¡çããintã«å€æããŠããã§æžãŸããŠããããã¡ãããã¡ããšADDã®ãããªå®æ°ãå®çŸ©ããŠãããçšããããšã¯ã§ããã®ã ãããã®ããã«ãµããæ¹æ³ã䜿ã£ãŠãããšãåŸã§goyaccã§äœ¿ããšãã«äŸ¿å©ãªã®ã§ãäžæåãããªãããŒã¯ã³ã§ããã°ããã§æžãŸãããšããã
æ§æè§£æåš
æ§æè§£æåšã¯ãããŒã¯ã³åãšããŠã®ãœãŒã¹ã³ãŒãããæšæ§é ãèªèããããã°ã©ã ã ã
ããã°ã©ãã³ã°èšèªã¯ãããã€ãã®éå±€ã«åããŠã¿ãããšãã§ãããäŸãã°æ¬¡ã®ãããªGoã®ããã°ã©ã ãèŠãŠã¿ãã
func f(a, b int) int {
c := g(a)
return h(a) + b + 2 * c
}
ããã«ã¯3ã€ã®éå±€ãããã
- 宣èš:
func f(a, b. int) int { ... } - æ:
c := g(a),return h(a) + b + 2 * c - åŒ:
g(a),h(a) + b + 2 * c
Goã®èšèªä»æ§ã«ãããããDeclaration, Statement, ExpressionãšããŠãåããŠèšè¿°ãããŠããã
ããããã®éå±€ã¯å¥ã®éå±€ãå«ãã宣èšã¯ããã€ãã®åŒãå«ã¿ãåŒã¯ããã€ãã®åŒãå«ãããã®ããã«éå±€æ§é ã«ãªã£ãŠããããããœãŒã¹ã³ãŒãã¯æšæ§é ãšããŠèªèã§ããã
æ§æå®çŸ©
goyaccã®ãããªããŒãµãŒãžã§ãã¬ãŒã¿ã¯ããœãŒã¹ã³ãŒããã©ã®ãããªæšæ§é ãæã£ãŠãããã«ã€ããŠã®èšè¿°ãããæ§æè§£æåšãçæããããã°ã©ã ã ãä»åäœãèšèªã®æ§æãgoyaccãèªèãã圢ã§èšè¿°ãããšæ¬¡ã®ãããªãã®ã«ãªãã
statement
: expr ';'
| VAR IDENT '=' expr ';'
expr
: NUMBER
| IDENT
| '-' expr
| '(' expr ')'
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| expr '%' expr
ãã®èšèªã«ã¯2çš®é¡ã®æãããã1ã€ã¯åã«åŒã䞊ã¹ããã®ããã1ã€ã¯å€æ°å®çŸ©ã§ãããåŒã䞊ã¹ãã ãã®æã¯"1+2;"ã®ããã«åŒã«ç¶ããŠã»ãã³ãã³ãæãŠã°è¯ãã®ã§ãexpr ';' ãšèšè¿°ããŠããããã1ã€ã®å€æ°å®çŸ©ã¯"var a = 1+2;"ã®ããã«æžãã°è¯ãã®ã§ãæ§æã®å®çŸ©ãVAR IDENT = expr ';'ãšããŠããããã®ããã«ä»ã®éå±€ã®æ§æå®çŸ©ãå©çšããªããããŸãå¥ã®æ§æãå®çŸ©ããŠããã
ãããã®æ§æå®çŸ©ã¯parser.go.yã«èšè¿°ããŠãããæ¬¡ã®ã³ãã³ããå®è¡ãããšæ§æè§£æåšãçæãããã
$ go tool yacc -o parser.go -v parser.output parser.go.y
ãã®ã³ãã³ãã«ãã£ãŠãparser.goãšparser.outputãçæããããparser.goã¯æ§æè§£æåšã§ãparser.outputã¯æ§æã«é¢ããçš®ã ã®æ å ±ãšãªã£ãŠããã
éçµç«¯èšå·ãšçµç«¯èšå·
æ§æå®çŸ©ã®äžã«ã¯2çš®é¡ã®èšå·ãåºãŠããŠãããstatementãexprã®ãããªãäœãã®éå±€ã衚ãèšå·ãšãVARã+ã®ãããªãå®éã«ãœãŒã¹ã³ãŒãäžã«åºãŠããããŒã¯ã³ã ãåè
ã®ããšãéçµç«¯èšå·ãåŸè
ã®ããšãçµç«¯èšå·ãšåŒã¶ãèŠãŠããããšãããå
ã»ã©ã®åå¥è§£æåšã§ãµãã£ãäžæåã®ããŒã¯ã³ã¯ããã§çããŠããŠãæ§æå®çŸ©ã®äžã§çµç«¯èšå·ãšããŠæ±ãããšãã§ããã
åå¥è§£æåšãšã®æ¥ç¶
æ§æå®çŸ©ãããããšãã§ããã¯ãããããã®ãŸãŸã§ã¯äœãããããšãã§ããªãããŸãå ã«æ§æè§£æåšãåãåãå ¥åéšåããåããŠããããšã«ããã
æ§æè§£æåšã¯åå¥è§£æåšãåºåããããŒã¯ã³åã䜿ã£ãŠåŠçãè¡ããããŒãµãŒãžã§ãã¬ãŒã¿ã«åå¥è§£æåšãã©ã®ãããªããŒã¯ã³ãåºåããããèªèãããŠããããã«ãããŒã¯ã³(ãšãã®ä»å±ç©)ã®å®çŸ©ãè¡ããæ§æå®çŸ©ã§ããparser.go.yããæç²ããã
%{
package calc
type Token struct {
tok int
lit string
pos Position
}
%}
%union{
tok Token
}
%token<tok> IDENT NUMBER VAR
ããã§ã%{ãã%}ãŸã§ã¯Goã®ãœãŒã¹ã³ãŒããšããŠèªèããããå
ã»ã©å®çŸ©ããåå¥è§£æåšã¯ããŒã¯ã³ãšããã€ãã®ä»å±ç©ãåºåããŠããã®ã§ããããè¡šãæ§é äœãå®çŸ©ããŠããã
%unionãæ§é äœãªã®ã ãããã¡ãã¯goyaccã®ã»ãã§èªèããããããã¯ããšã§äœåãã«åããŠèª¬æããã
%token<tok>ã§å§ãŸããšããã¯ãåå¥è§£æåšãåºåããããŒã¯ã³å®çŸ©ã§ãããäžæåã®èšå·ããŒã¯ã³ã¯å®çŸ©ããªããŠãèªèãããã
ã€ãã«ãå®éã«åå¥è§£æåšã®åŒã³åºããè¡ãéšåãæç²ããã
type LexerWrapper struct {
s *Scanner
recentLit string
recentPos Position
}
func (l *LexerWrapper) Lex(lval *yySymType) int {
tok, lit, pos := l.s.Scan()
if tok == EOF {
return 0
}
lval.tok = Token{tok: tok, lit: lit, pos: pos}
l.recentLit = lit
l.recentPos = pos
return tok
}
func (l *LexerWrapper) Error(e string) {
log.Fatalf("Line %d, Column %d: %q %s",
l.recentPos.Line, l.recentPos.Column, l.recentLit, e)
}
func Parse(s *Scanner) {
l := LexerWrapper{s: s}
if yyParse(&l) != 0 {
panic("Parse error")
}
}
goyaccã¯LexãšErrorãšããã¡ãœãããå®çŸ©ããæ§é äœãåå¥è§£æåšãšããŠèªèãããå
ã»ã©äœã£ãåå¥è§£æåšãšã€ã³ã¿ãŒãã§ãŒã¹ãåãããããã«ãã©ãããŒãåãŸããŠå©çšããã
Lexã¯*yySymTypeãšããå€ãåãåã£ãŠããããã®åã¯goyaccãå®çŸ©ããåã§ãå®éã¯ããšã§èª¬æãããšãã%unionã§ãããLexã¯ããŒã¯ã³ã衚ãintãè¿ãããã®ä»éç©(ãªãã©ã«ãããžã·ã§ã³)ã*yySymTypeã«å
¥ããããšãæ³å®ããŠããã®ã§ããã®ããå®çŸ©ããŠããããŸãããšã©ãŒãã³ããªã³ã°ã®ããã«ãæåŸã«æž¡ãããªãã©ã«ãªã©ãå¥éä¿åããŠå©çšããŠããã
ãã®ã©ãããŒãå©çšããŠgoyaccãå®çŸ©ããyyParseã«æž¡ãããšã§LexãåŒã³åºãããŠãããæ§æè§£æãå§ãŸããyyParseã¯0ãè¿ããšæ£åžžçµäºã§ããã§ãªãå Žåã¯ãšã©ãŒãšãªãã
æœè±¡æ§ææšãè¿ãããã«ãã
ãã®ãŸãŸåããããšãã§ããŠããã¡ããšæ§æãèªèãããã°Parseã¯äœãããè¿ã£ãŠããŠãæ§æãšã©ãŒããããšpanicã§çµäºãããããããããã§ã¯ããã¡ãã£ãšæå³ã®ããå€ãè¿ãããã«ããããããã§ã¯æœè±¡æ§ææšãè¿ãããã«ããŠã¿ããã
æœè±¡æ§ææšã¯ast.goã§å®çŸ©ããŠãããäŸãã°å€æ°å®çŸ©ã®æã«å¯Ÿå¿ããæœè±¡æ§ææšã¯æ¬¡ã®ããã«ãªãã
type VarDefStatement struct {
VarName string
Expr Expression
}
ãã®ããã«åŸã
ã®åŠçã§å¿
èŠã«ãªãæ
å ±ã ãåãåºããŠããããæ§æè§£æåšãè¿ããŠãããã°ãããã€ãŸãã倿°å®çŸ©ã®æãèªèããããããã«å¯Ÿå¿ããããã«VarDefStatementãäœã£ãŠããããè¿ããŠãããããã«ãããã
goyaccã¯åéçµç«¯èšå·ã»çµç«¯èšå·ã«å¯ŸããŠãããããå€ãè¿ãããšããããšãå®çŸ©ããããšãã§ããã%unionã®å®çŸ©ããããæ¬¡ã®ããã«ããã
%union{
statements []Statement
statement Statement
expr Expression
tok Token
}
%type<statements> statements
%type<statement> statement
%type<expr> expr
%token<tok> IDENT NUMBER VAR
%unionã¯ãããããå€ãè¿ããã®ãããããå€ããåãããæ§é äœã«ãªãããããŠã%type<...>ã%token<...>ã§ããã®éçµç«¯èšå·ã»çµç«¯èšå·ã¯%unionã®äžã®ãã®ãã£ãŒã«ãã«ä»£å
¥ã§ããå€ãè¿ãããšããããšãå®çŸ©ã§ããã
次ã«ãããããå€ããå®éã«äœãããã«ãæ§æå®çŸ©ã®æ¹ãæŽããŠãããVarDefStatementãäœãéšåãæç²ããŠç€ºãã
statement
: VAR IDENT '=' expr ';'
{
$$ = &VarDefStatement{VarName: $2.lit, Expr: $4}
}
äžæ¬åŒ§ã§å²ãŸããéšåã¯Goã®ãœãŒã¹ã³ãŒãã«ãªãããã ãã$$ã$2ãªã©ã®ç¹å¥ãªå€æ°ã䜿ããã
$$ã¯ãã®æ§æã®è¿ãå€ãçŸã倿°ã§ãããäŸãã°statementã¯%unionã®äžã®statementãã£ãŒã«ãã«ä»£å
¥ã§ããå€ãè¿ããšããã®ã§ã$$ã¯Statementåã®å€æ°ã«ãªããããã§ã¯VarDefStatementãäœã£ãŠãããã代å
¥ããŠããã
$2ã®ãããªå€æ°ã¯æ§æå®çŸ©äžã«åºãŠããããŒã¯ã³åã®å€ã«ãªããäŸãã°ãã®å€æ°å®çŸ©ã§ã¯æ¬¡ã®ããã«ç¹æ®å€æ°ãå®çŸ©ãããã
-
$1(VAR):Token -
$2(IDENT):Token -
$3('='):Token -
$4(expr):Expression -
$5(';'):Token
ãã®ããã«ã»ãã®æ§æã®å€ãåç
§ã§ããã®ã§ããããçšããŠæ°ããå€ãäœã£ãŠããããšã«ãªããäŸãã°var a = 1 + 2;ã®ãããªæãèããããã®äžã§1 + 2ã®éšåã¯exprã§åŠçãããŠããã®äžã§$$ã«é©åãªExpressionåã®å€ã代å
¥ãããããããããšä»åºŠã¯statementã§å€æ°å®çŸ©ã®æãšããŠèªèããããšãã«ããã£ãexprã§$$ã«ä»£å
¥ãããå€ããä»åºŠã¯$4ãšããŠçŸããŠäœ¿ããããã«ãªãããããŠããŸã$$ã«ä»£å
¥ãããStatementåã®å€ã¯ãå¥ã®ã©ããã®æ§æå®çŸ©ã§$3ã¿ãããªåœ¢ã§çŸããããããç¶ããŠããããšã§ãèªã¿èŸŒãŸããããŒã¯ã³åå
šäœãäžã€ã®å€ã«ãªããŸã§å€æãããŠããã
ãããã¬ãã«ã®å€ãè¿ã
ãããŸã§ã§ããŒã¯ã³åããæ§é ãæãåºããŠããããä»åºŠã¯å€ã«å€æããŠãããšãããšãããŸã§åºæ¥ããæåŸã«åºæ¥ãå€ãParseãåŒã³åºããåŽã«è¿ãããããããæ®å¿µãªããšã«ãParseãåŒã³åºãyyParseã¯ãšã©ãŒããã£ããã©ããã®æŽæ°å€ããè¿ããŠãããªãã
æåŸã«åºæ¥ãå€ãè¿ãããã«ããã«ã¯ãã¡ãã£ãšããªãããŒãªããšãããªããã°ãããªãããã®éšåãæç²ããŠç€ºãã
statements
: statement statements
{
$$ = append([]Statement{$1}, $2...)
if l, isLexerWrapper := yylex.(*LexerWrapper); isLexerWrapper {
l.statements = $$
}
}
ä»äœã£ãŠããèšèªã¯æçµçã«ããã°ã©ã ã¯[]Statementåã®å€ã«ãªãããã«å€æããŠãããããã¯ãã®éšåã®æ§æå®çŸ©ã«ãªããéåžžã®ããã«$$ãšãã倿°ã«å€ã代å
¥ããŠãããããã以å€ã«ãäœããè¡ã£ãŠããã
ãã®æ§æå®çŸ©ã§æžãã{...}ã®éšåã§ã¯$$ã$2以å€ã«ãyylexãšãã倿°ã䜿ãããšãã§ããããã®å€æ°ã¯yyParseã«äžããåå¥è§£æåšãå
¥ã£ãŠãããããã§ãåå¥è§£æåšã®äžã«æçµçã«è¿ãã¹ãå€ãã³ããœãªä¿åããŠãããæåŸã«ãã®å€ãè¿ãããã«ãããä¿åã§ããããã«ããããã«ãLexerWrapperã®å®çŸ©ãå°ãå€ããŠããã
type LexerWrapper struct {
s *Scanner
recentLit string
recentPos Position
statements []Statement
}
func Parse(s *Scanner) []Statement {
l := LexerWrapper{s: s}
if yyParse(&l) != 0 {
panic("Parse error")
}
return l.statements
}
æ°ããstatementsãšãããã£ãŒã«ããåºæ¥ãŠãããParseã§ã¯ããã«ä¿åãããå€ãåã£ãŠããŠç¡çããè¿ããŠããã
å¥ã®æ¹æ³: ã°ããŒãã«å€æ°ã§è¿ã
ã°ããŒãã«å€æ°ãçšæããŠããããçµç±ããŠæçµçãªå€ãè¿ãããã«ãããšããæ¹æ³ããããããããgoyaccã¯ã°ããŒãã«å€æ°ã«äŸåããªããããªããã°ã©ã ãçæããŠãããã®ã§ãæåŸã®æåŸã§ã°ããŒãã«å€æ°ã«äŸåããŠããŸãã®ããããŸãè¯ããªãæ°ãããããã®åå¥è§£æåšã«å€ãåã蟌ãã§ããŸãæ¹æ³ãããªãæ±ãæ¹æ³ã ãšã¯æãããå°ãªããšãæ§æè§£æåšèªäœã®ãªãšã³ãã©ã³ãæ§ã¯ä¿ã€ããšãã§ããã
èœãšã穎: ã¹ã¿ãã¯ã®å€ã®åç §ãè¿ããŠã¯ãããªã
goyaccã®å
éšã§ã¯%unionã®æ§é äœã®ã¹ã©ã€ã¹ãçšããŠåæ§æã®å€ãä¿æããŠããããªã®ã§$$ã¯åžžã«zero-valueã§ããããã§ã¯ãªããåã«äœ¿çšããå€ãå
¥ã£ãŠããããããéã«èšãã°$$ã«å
¥ããå€ã¯æ§æè§£æãé²ãäžã§æžãæããããå¯èœæ§ãããããã£ãŠãäŸãã°&$3ã®ããã«æ§é äœäžã®å€ã®åç
§ãå©çšããŠã¯ãããªãã
Cèšèªã ãšããããããããã£ãåç
§ãåãããšãããšãã«ãå€ãªããšããã£ãŠããããšããæèŠãããã®ã ããGoã ãšäžèŠã¹ã¿ãã¯ã«ä¹ã£ãŠããããªå€ã§ããåç
§ãåã£ãŠè¿ãããšãã§ãããgoyaccã®ã¢ã¯ã·ã§ã³éšåã§ããããããšãå€ãªãã°ãåã蟌ãããšã«ãªãã$4ã®ãããªèšå·ã¯ã倿°ã«èŠããŠå®ã¯éãã®ã§æ³šæãããã
è©äŸ¡åš
åå¥è§£æåšã«ãã£ãŠãæååãããŒã¯ã³åã«åè§£ãããã®ãèŠãããŸãæ§æè§£æåšã«ãã£ãŠããŒã¯ã³åãæœè±¡æ§ææšã«å€æãããã®ãèŠãããããŸã§ã§ãgoyaccã®äœ¿ãæ¹ãšããŠã¯çµãããªã®ã ããäžéå端ã«ãªã£ãŠããŸãã®ã§ãç°¡åãªè©äŸ¡åšãäœã£ãããœãŒã¹ã³ãŒãäžã®evaluator.goãåç §ãããããè©äŸ¡åšã¯ç¹ã«ç¹å¥ãªããšãè¡ã£ãŠããããçŽ æŽã«åŒã®è©äŸ¡ãè¡ã£ãŠããã ãã§ããã
ãŸãšã
å°ããªèšèªåŠçç³»ã®äœæéçšãéããŠãgoyaccã®äœ¿ãæ¹ã«ã€ããŠèª¬æãããããã説æããããŠããªãéšåãããã
- goyaccãå ¥åãšããŠåãåããã¡ã€ã«ã®æ§æ
- æŒç®åã®åªå é äœ
- æœè±¡æ§ææšã®å®çŸ©
ããããè£ãããã«ããã®æç« ãæžãããã§åèã«ãããã®ã玹ä»ããŠããããŸããããèå³ããã人ã«åããŠãã©ã®ãããªæ å ±ãããã®ãã玹ä»ããã
-
æ®éã®yacc
goyaccã¯åã«yaccã®GoããŒãžã§ã³ãšããã ããªã®ã§ãæ®éã®yaccã®ç¥èãã ããããã®ãŸãŸäœ¿ãããæ®éã®yaccã«ã€ããŠã¯éç¿yaccãåèã«ãªãã
-
Goã®æšæºããã±ãŒãž
æœè±¡æ§ææšãªã©ãã©ãå®çŸ©ããŠãããã«ã€ããŠã¯ãGoã®æšæºããã±ãŒãžã§ããgo/astãåèã«ãªããããã§æ±ã£ãèšèªåŠçç³»ã§ããgo/astããã±ãŒãžãåèã«ããŠæœè±¡æ§ææšãå®çŸ©ããããŸããåå¥è§£æåšãgo/scannerããã±ãŒãžãåèã«ããŠäœæãããgoã®ãœãŒã¹ã³ãŒãäžã®src/pkg/go/astãsrc/pkg/go/scannerã該åœããã
-
goyaccã³ãã³ã
goyaccèªäœãå®ã¯Goã§æžãããŠããããã®ããã°ã©ã ã¯çµæ§å°ããã1ã€ã®ãã¡ã€ã«ã§3500è¡åŒ±ã«åãŸã£ãŠãããäžã§ã©ã®ãããªåŠçãè¡ã£ãŠããã®ããåºåããããœãŒã¹ã³ãŒãã¯ã©ãããæ§æã«ãªã£ãŠããã®ããã©ã®ãããªå®çŸ©ãèªèãããã®ããšãã£ãããšã«ã€ããŠç°¡åã«ç¥ãããšãã§ãããsrc/cmd/yaccããœãŒã¹ã³ãŒãã«ãªããåããã£ã¬ã¯ããªã«ãµã³ãã«ãœãŒã¹ã眮ããŠããã®ã§ããã¡ããåç §ãããã
-
goã®åŠçç³»
goã®åŠçç³»èªäœãããŒãµãŒãžã§ãã¬ãŒã¿ãå©çšããŠæ§æè§£æåšãäœã£ãŠãããgoã¯yaccã§ã¯ãªãBisonã䜿ã£ãŠããã®ã ãããã¡ã€ã«æ§æèªäœã¯ããŸãå€ãããªããsrc/cmd/gc/go.yãæ§æå®çŸ©ãã¡ã€ã«ã«ãªãã
-
ãšã©ãŒã¡ãã»ãŒãžçæ
goã®åŠçç³»ã§ã¯é¢çœãããšã«ãyaccãçæããparser.outputã®ãããªãã¡ã€ã«ããæ§æãšã©ãŒã®ã¡ãã»ãŒãžãèªåçæããŠãããsrc/cmd/gc/bisonerrorsããšã©ãŒã¡ãã»ãŒãžãçæããã¹ã¯ãªããã«ãªããåé ã«ãã®ãšã©ãŒã¡ãã»ãŒãžãçæããæ¹æ³ã®ããŒã¹ãšãªã£ãè«æãåç §ãããŠãããGenerating LR syntax error messages from examples
-
æžç±ãªã©
æåã©ããã ãšThe Dragon Bookãšãææ°ã³ã³ãã€ã©æ§æææ³ã ããååãã®ã§ããŸãèªãæ°ã«æ £ããªãã(åŸè ã¯ãŸã èªããæ°ãããã)
åå¥è§£æãæ§æè§£æã ãã«çµã£ãŠããã詳ããç¥ãããã®ã§ããã°ãèæ¯ã«ããã®ã¯ãªãŒãããã³çè«ãªã®ã§ã倧åŠã®æ å ±ç³»ã®ã·ã©ãã¹ãã¿ãŠãããèŸºã®æç§æžãªããèŠãã°æŠèŠã¯ã€ãããã
ãã£ãšçé¢ç®ãªã³ã³ãã€ã©ã®äœãæ¹ã§ããã°ãMinCamlã®è§£èª¬ãæ±å€§ã®ã³ã³ãã€ã©æŒç¿ãããã®è³æããããåèã«ãªããããã¡ãã£ãšå€ããããåæšè«ãšãã«ã€ããŠã²ãŒã æèŠã§æŒç¿ãããããã®ã§ããã°ãããã°ã©ãã³ã°èšèªã®åºç€æŠå¿µã®æŒç¿ã·ã¹ãã ãããã
-
æŒç¿ãªã©
çŸåšã¯DSLã ã£ããRubyãªã©ã䜿ã£ãŠå éšDSLãæžããããYAMLãšãã«ã®ããŠæžãŸããã»ããæ¥œãªã®ã§ããã¡ãã¡æ§æè§£æãããŠèšèªãã€ããããšãç¡ãã ãããããã§ãããã€ãèšèªåŠçç³»ãã€ãã£ãŠã¿ããã®ã§ããã°ãäŸãã°ä»åã®èšç®æ©ãããŒã¹ã«æ¬¡ã®ãããªããšãã§ããã ããã
- Goã®ãããªã»ãã³ãã³èªåæ¿å ¥
- 颿°å®çŸ©ã»é¢æ°åŒã³åºãã®å°å ¥
-
ifãforãªã©ã®å¶åŸ¡æã®å°å ¥ - VMã³ãŒããä»èšèªãžã®ã³ã³ãã€ã«
VMãªã©ã¯èªåã§é©åœãªåœä»€ããã€æ©æ¢°ãå®çŸ©ããŠããããå®è¡ã§ãã圢ã«å€æŽããŠããã°ãããä»ã¯JVMäžã§åãèšèªãæµè¡ãã ããJVMãåœä»€ã»ããã¯ç°¡åãªã®ã§ãããåŠãã§ã¿ãã°classãã¡ã€ã«ã«ã³ã³ãã€ã«ã§ãããJasminãšããJVMã¢ã»ã³ãã©ãããã®ã§ããããå©çšãããšæ¥œã«ã§ããã ãããJVMèªäœã«ã€ããŠåŠã¶ã«ã¯Programming for the Java Virtual Machineã詳ããæžããŠãããèªã¿ãããã£ãã
ããå°ããæ§æè§£æã ãã«çµã£ãŠæŒç¿ãããŠã¿ããã®ã§ããã°ãããã°ã©ãã³ã°ã³ã³ãã¹ãã®æ§æè§£æç³»ã®åé¡ãè§£ããŠã¿ãã®ãããã ãããAizu Online Judgeã«ããæ§æè§£æã«ããŽãªã®åé¡ãæè»œã§è¯ããããããããã°ã©ãã³ã°ã³ã³ãã¹ãã§åºãããæ§æè§£æã®åé¡ã¯ååž°äžéæ§æè§£æã§ããè§£ããŠããŸãã®ã§ãããŸãé¢çœããªããããããªããååž°äžéæ§æè§£æã®æ¹æ³ã«ã€ããŠã¯æ§æè§£æ Howtoãšããæç« ãæžããã®ã§ããã¡ããåç §ããããã
-
颿°åèšèªã®äžç
颿°åèšèªã«ãããæ§æè§£æã¯ãŸãå¥ã®äžçã«ãã£ãŠãããäŸãã°Haskellã®å ¥éæžã§ã¯é »ç¹ã«æ§æè§£æã®åé¡ãåãæ±ã£ãŠããããã«æãããICFPãããã®è«æãæ¢ããŠããã°ãããã€ãæ§æè§£æã«é¢ããè«æãèŠã€ããã¯ããªã®ã§ãããããèªããšYaccãšã¯éãã¢ãããŒãããšã£ãŠããŠé¢çœããšæãã¯ãã ãã¿ã€ãã«ãç œã£ãŠããŠé¢çœãã®ã§Yacc is deadãèªãã§ã¿ããšãããããããªãã
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
