Last active
January 3, 2016 20:09
-
-
Save mohayonao/8513530 to your computer and use it in GitHub Desktop.
SuperColliderの構文解析をまとめたもの
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://github.com/supercollider/supercollider/blob/master/lang/LangSource/Bison/lang11d | |
%token NAME INTEGER FLOAT ACCIDENTAL SYMBOL STRING ASCII PRIMITIVENAME CLASSNAME | |
%token PSEUDOVAR | |
%token INTERPRET | |
%left ':' | |
%right '=' | |
%left BINOP KEYBINOP '-' '<' '>' '*' '+' '|' | |
%left '.' | |
%right '`' | |
%right UMINUS | |
%start root | |
%error-verbose | |
%% | |
root | |
: classes | |
| classextensions | |
| INTERPRET cmdlinecode | |
; | |
classes | |
: | |
| classes classdef | |
; | |
classextensions | |
: classextension | |
| classextensions classextension | |
; | |
classdef | |
: classname superclass '{' classvardecls methods '}' | |
| classname '[' optname ']' superclass '{' classvardecls methods '}' | |
; | |
classextension | |
: '+' classname '{' methods '}' | |
; | |
optname | |
: | |
| name | |
; | |
superclass | |
: | |
| ':' classname | |
; | |
classvardecls | |
: | |
| classvardecls classvardecl | |
; | |
classvardecl | |
: 'classvar' rwslotdeflist ';' | |
| 'var' rwslotdeflist ';' | |
| 'const' constdeflist ';' | |
; | |
methods | |
: | |
| methods methoddef | |
; | |
methoddef | |
: name '{' argdecls funcvardecls primitive methbody '}' | |
| '*' name '{' argdecls funcvardecls primitive methbody '}' | |
| binop '{' argdecls funcvardecls primitive methbody '}' | |
| '*' binop '{' argdecls funcvardecls primitive methbody '}' | |
; | |
optsemi | |
: | |
| ';' | |
; | |
optcomma | |
: | |
| ',' | |
; | |
optequal | |
: | |
| '=' | |
; | |
funcbody | |
: funretval | |
| exprseq funretval | |
; | |
cmdlinecode | |
: '(' funcvardecls1 funcbody ')' | |
| funcvardecls1 funcbody | |
| funcbody | |
; | |
methbody | |
: retval | |
| exprseq retval | |
; | |
primitive | |
: | |
| primname optsemi | |
; | |
retval | |
: | |
| '^' expr optsemi | |
; | |
funretval | |
: | |
| '^' expr optsemi | |
; | |
blocklist1 | |
: blocklistitem | |
| blocklist1 blocklistitem | |
; | |
blocklistitem | |
: blockliteral | |
| generator | |
; | |
blocklist | |
: | |
| blocklist1 | |
; | |
msgsend | |
: name blocklist1 | |
| '(' binop2 ')' blocklist1 | |
| name '(' ')' blocklist1 | |
| name '(' arglist1 optkeyarglist ')' blocklist | |
| '(' binop2 ')' '(' ')' blocklist1 | |
| '(' binop2 ')' '(' arglist1 optkeyarglist ')' blocklist | |
| name '(' arglistv1 optkeyarglist ')' | |
| '(' binop2 ')' '(' arglistv1 optkeyarglist ')' | |
| classname '[' arrayelems ']' | |
| classname blocklist1 | |
| classname '(' ')' blocklist | |
| classname '(' keyarglist1 optcomma ')' blocklist | |
| classname '(' arglist1 optkeyarglist ')' blocklist | |
| classname '(' arglistv1 optkeyarglist ')' | |
| expr '.' '(' ')' blocklist | |
| expr '.' '(' keyarglist1 optcomma ')' blocklist | |
| expr '.' name '(' keyarglist1 optcomma ')' blocklist | |
| expr '.' '(' arglist1 optkeyarglist ')' blocklist | |
| expr '.' '(' arglistv1 optkeyarglist ')' | |
| expr '.' name '(' ')' blocklist | |
| expr '.' name '(' arglist1 optkeyarglist ')' blocklist | |
| expr '.' name '(' arglistv1 optkeyarglist ')' | |
| expr '.' name blocklist | |
generator | |
: '{' ':' exprseq ',' qual '}' | |
| '{' ';' exprseq ',' qual '}' | |
; | |
nextqual | |
: | |
| ',' qual | |
; | |
qual | |
: name '<-' exprseq nextqual | |
| name name '<-' exprseq nextqual | |
| 'var' name '=' exprseq nextqual | |
| exprseq nextqual | |
| ':' ':' exprseq nextqual | |
| ':' 'while' exprseq nextqual | |
; | |
expr1 | |
: pushliteral | |
| blockliteral | |
| generator | |
| pushname | |
| curryarg | |
| msgsend | |
| '(' exprseq ')' | |
| '~' name | |
| '[' arrayelems ']' | |
| '(' valrange2 ')' | |
| '(' ':' valrange3 ')' | |
| '(' dictslotlist ')' | |
| pseudovar | |
| expr1 '[' arglist1 ']' | |
| valrangex1 | |
; | |
valrangex1 | |
: expr1 '[' arglist1 '..' ']' | |
| expr1 '[' '..' exprseq ']' | |
| expr1 '[' arglist1 '..' exprseq ']' | |
; | |
valrangeassign | |
: expr1 '[' arglist1 '..' ']' '=' expr | |
| expr1 '[' '..' exprseq ']' '=' expr | |
| expr1 '[' arglist1 '..' exprseq ']' '=' expr | |
; | |
valrangexd | |
: expr '.' '[' arglist1 '..' ']' | |
| expr '.' '[' '..' exprseq ']' | |
| expr '.' '[' arglist1 '..' exprseq ']' | |
| expr '.' '[' arglist1 '..' ']' '=' expr | |
| expr '.' '[' '..' exprseq ']' '=' expr | |
| expr '.' '[' arglist1 '..' exprseq ']' '=' expr | |
; | |
valrange2 | |
: exprseq '..' | |
| '..' exprseq | |
| exprseq '..' exprseq | |
| exprseq ',' exprseq '..' exprseq | |
| exprseq ',' exprseq '..' | |
; | |
valrange3 | |
: '..' exprseq | |
| exprseq '..' | |
| exprseq '..' exprseq | |
| exprseq ',' exprseq '..' | |
| exprseq ',' exprseq '..' exprseq | |
; | |
expr | |
: expr1 | |
| valrangexd | |
| valrangeassign | |
| classname | |
| expr '.' '[' arglist1 ']' | |
| '`' expr | |
| expr binop2 adverb expr %prec BINOP | |
| name '=' expr | |
| '~' name '=' expr | |
| expr '.' name '=' expr | |
| name '(' arglist1 optkeyarglist ')' '=' expr | |
| '#' mavars '=' expr | |
| expr1 '[' arglist1 ']' '=' expr | |
| expr '.' '[' arglist1 ']' '=' expr | |
; | |
adverb | |
: | |
| '.' name | |
| '.' integer | |
| '.' '(' exprseq ')' | |
; | |
exprn | |
: expr | |
| exprn ';' expr | |
; | |
exprseq | |
: exprn optsemi | |
; | |
arrayelems | |
: | |
| arrayelems1 optcomma | |
; | |
arrayelems1 | |
: exprseq | |
| exprseq ':' exprseq | |
| keybinop exprseq | |
| arrayelems1 ',' exprseq | |
| arrayelems1 ',' keybinop exprseq | |
| arrayelems1 ',' exprseq ':' exprseq | |
; | |
arglist1 | |
: exprseq | |
| arglist1 ',' exprseq | |
; | |
arglistv1 | |
: '*' exprseq | |
| arglist1 ',' '*' exprseq | |
; | |
keyarglist1 | |
: keyarg | |
| keyarglist1 ',' keyarg | |
; | |
keyarg | |
: keybinop exprseq | |
; | |
optkeyarglist | |
: optcomma | |
| ',' keyarglist1 optcomma | |
; | |
mavars | |
: mavarlist | |
| mavarlist '...' name | |
; | |
mavarlist | |
: name | |
| mavarlist ',' name | |
; | |
slotliteral | |
: integer | |
| floatp | |
| ascii | |
| string | |
| symbol | |
| trueobj | |
| falseobj | |
| nilobj | |
| listlit | |
; | |
blockliteral | |
: block | |
; | |
pushname | |
: name | |
; | |
pushliteral | |
: integer | |
| floatp | |
| ascii | |
| string | |
| symbol | |
| trueobj | |
| falseobj | |
| nilobj | |
| listlit | |
; | |
listliteral | |
: integer | |
| floatp | |
| ascii | |
| string | |
| symbol | |
| name | |
| trueobj | |
| falseobj | |
| nilobj | |
| listlit2 | |
| dictlit2 | |
; | |
block | |
: '{' argdecls funcvardecls funcbody '}' | |
| '#' '{' argdecls funcvardecls funcbody '}' | |
; | |
funcvardecls | |
: | |
| funcvardecls funcvardecl | |
; | |
funcvardecls1 | |
: funcvardecl | |
| funcvardecls1 funcvardecl | |
; | |
funcvardecl | |
: 'var' vardeflist ';' | |
; | |
argdecls | |
: | |
| 'arg' vardeflist ';' | |
| 'arg' vardeflist0 '...' name ';' | |
| '|' slotdeflist '|' | |
| '|' slotdeflist0 '...' name '|' | |
; | |
constdeflist | |
: constdef | |
| constdeflist optcomma constdef | |
; | |
constdef | |
: rspec name '=' slotliteral | |
; | |
slotdeflist0 | |
: | |
| slotdeflist | |
; | |
slotdeflist | |
: slotdef | |
| slotdeflist optcomma slotdef | |
; | |
slotdef | |
: name | |
| name optequal slotliteral | |
| name optequal '(' exprseq ')' | |
; | |
vardeflist0 | |
: | |
| vardeflist | |
; | |
vardeflist | |
: vardef | |
| vardeflist ',' vardef | |
; | |
vardef | |
: name | |
| name '=' expr | |
| name '(' exprseq ')' | |
; | |
dictslotdef | |
: exprseq ':' exprseq | |
| keybinop exprseq | |
; | |
dictslotlist1 | |
: dictslotdef | |
| dictslotlist1 ',' dictslotdef | |
; | |
dictslotlist | |
: | |
| dictslotlist1 optcomma | |
; | |
rwslotdeflist | |
: rwslotdef | |
| rwslotdeflist ',' rwslotdef | |
; | |
rwslotdef | |
: rwspec name | |
| rwspec name '=' slotliteral | |
; | |
dictlit2 | |
: '(' litdictslotlist ')' | |
; | |
litdictslotdef | |
: listliteral ':' listliteral | |
| keybinop listliteral | |
; | |
litdictslotlist1 | |
: litdictslotdef | |
| litdictslotlist1 ',' litdictslotdef | |
; | |
litdictslotlist | |
: | |
| litdictslotlist1 optcomma | |
; | |
listlit | |
: '#' '[' literallistc ']' | |
| '#' classname '[' literallistc ']' | |
; | |
listlit2 | |
: '[' literallistc ']' | |
| classname '[' literallistc ']' | |
; | |
literallistc | |
: | |
| literallist1 optcomma | |
; | |
literallist1 | |
: listliteral | |
| literallist1 ',' listliteral | |
; | |
rwspec | |
: | |
| '<' | |
| '<>' | |
| '>' | |
; | |
rspec | |
: | |
| '<' | |
; | |
integer | |
: INTEGER | |
| '-'INTEGER %prec UMINUS | |
; | |
floatr | |
: FLOAT | |
| '-' FLOAT %prec UMINUS | |
; | |
accidental | |
: ACCIDENTAL | |
| '-' ACCIDENTAL %prec UMINUS | |
; | |
pie | |
: 'pi' | |
; | |
floatp | |
: floatr | |
| accidental | |
| floatr pie | |
| integer pie | |
| pie | |
| '-' pie | |
; | |
name | |
: NAME | |
| 'while' | |
; | |
classname | |
: CLASSNAME | |
; | |
primname | |
: PRIMITIVENAME | |
; | |
trueobj | |
: 'true' | |
; | |
falseobj | |
: 'false' | |
; | |
nilobj | |
: 'nil' | |
; | |
ascii | |
: ASCII | |
; | |
symbol | |
: SYMBOL | |
; | |
string | |
: STRING | |
; | |
pseudovar | |
: PSEUDOVAR | |
; | |
binop | |
: BINOP | |
| '<>' | |
| '<' | |
| '>' | |
| '-' | |
| '*' | |
| '+' | |
| '|' | |
; | |
keybinop | |
: KEYBINOP | |
; | |
binop2 | |
: binop | |
| keybinop | |
; | |
curryarg | |
: '_' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment