Skip to content

Instantly share code, notes, and snippets.

@mohayonao
Last active January 3, 2016 20:09
Show Gist options
  • Save mohayonao/8513530 to your computer and use it in GitHub Desktop.
Save mohayonao/8513530 to your computer and use it in GitHub Desktop.
SuperColliderの構文解析をまとめたもの
// 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