cat y.output | lua yacc-grammar-extractor.lua
g++ -o yacc-grammar-extractor yacc-grammar-extractor.cpp -std=c++1y
cat y.output | ./yacc-grammar-extractor
Lua 1.1 の YACC ファイル lua.stx
の y.output
を以下コマンドで生成.
yacc -v lua.sty
生成された y.output
から文法情報のみ抽出.
cat y.output | lua yacc-grammar-extractor.lua
以下のような出力が得られる.
exprlist: /* empty */
| exprlist1
statlist: /* empty */
| statlist stat sc
decinit: /* empty */
| '=' exprlist1
ffieldlist1: ffield
| ffieldlist1 ',' ffield
expr1: expr
var: NAME
| var '[' expr1 ']'
| var '.' NAME
function: FUNCTION NAME '(' parlist ')' block END
ffieldlist: /* empty */
| ffieldlist1
lfieldlist1: expr1
| lfieldlist1 ',' expr1
localdeclist: NAME
| localdeclist ',' NAME
expr: '(' expr ')'
| expr1 '=' expr1
| expr1 '<' expr1
| expr1 '>' expr1
| expr1 NE expr1
| expr1 LE expr1
| expr1 GE expr1
| expr1 '+' expr1
| expr1 '-' expr1
| expr1 '*' expr1
| expr1 '/' expr1
| expr1 CONC expr1
| '+' expr1
| '-' expr1
| typeconstructor
| '@' '(' dimension ')'
| var
| NUMBER
| STRING
| NIL
| functioncall
| NOT expr1
| expr1 AND PrepJump expr1
| expr1 OR PrepJump expr1
typeconstructor: '@' objectname fieldlist
PrepJump: /* empty */
objectname: /* empty */
| NAME
varlist1: var
| varlist1 ',' var
$accept: functionlist $end
exprlist1: expr
| exprlist1 ',' expr
block: statlist ret
parlist: /* empty */
| parlist1
parlist1: NAME
| parlist1 ',' NAME
stat1: IF expr1 THEN PrepJump block PrepJump elsepart END
| WHILE expr1 DO PrepJump block PrepJump END
| REPEAT block UNTIL expr1 PrepJump
| varlist1 '=' exprlist1
| functioncall
| typeconstructor
| LOCAL localdeclist decinit
dimension: /* empty */
| expr1
ffield: NAME '=' expr1
sc: /* empty */
| ';'
stat: stat1
functionvalue: var
ret: /* empty */
| RETURN exprlist sc
elsepart: /* empty */
| ELSE block
| ELSEIF expr1 THEN PrepJump block PrepJump elsepart
setdebug: DEBUG
functionlist: /* empty */
| functionlist stat sc
| functionlist function
| functionlist setdebug
functioncall: functionvalue '(' exprlist ')'
lfieldlist: /* empty */
| lfieldlist1
fieldlist: '{' ffieldlist '}'
| '[' lfieldlist ']'