Files
smnp-py/grammar
2019-07-06 12:40:21 +02:00

38 lines
1.1 KiB
Plaintext

# Tokenizer
DIGIT = [0-9]
ID = [a-zA-Z_]
CHAR = ... \ '"'
PITCH = 'c' | 'd' | 'e' | 'f' | 'g' | 'a' | 'h'
PITCH_MODIFIER = 'b' | '#'
<integer> := '-' DIGIT+ | DIGIT+
<string> := '"' CHAR* '"'
<note> := '@' PITCH PITCH_MODIFIER? DIGIT? ['.' DIGIT+ 'd'?]?
<identifier> := ID [ID|DIGIT]*
# Parser
<expr> := <integer> <accessTail> | <integer>
<expr> := <string> <accessTail> | <string>
<expr> := <note> <accessTail> | <note>
<expr> := <identifier> <accessTail> | <identifier> '=' <expr> | <identifier> <list> | <identifier>
<expr> := <list> <accessTail> | <list>
<accessTail> := '.' <expr> <accessTail> | e
<list> := '[' ']' | '[' <expr> <listTail>
<listTail> := <expr> ', ' <listTail> | ']'
<arglist> := '(' ')' | '(' <expr> <arglistTail>
<arglistTail> := <expr> ', ' <arglistTail> | ')'
block := '{' <stmt>* '}'
<stmt> := <expr> <asteriskTail> | <expr> #nie wiem czy zamiast '<expr> <asteriskTail>' nie powinno być wprost co może wyprodukować iterator dla asterisk
<asteriskTail> := '*' <stmt> | e
<stmt> := <block>
<stmt> := 'return' <expr>
<stmt> := 'function' <identifier> <list> block
<program> := <stmt>*