Simkin Script Grammar
This is a description of the Simkin grammar in EBNF format:
compound_statement: "{" (<statement>)* "}"
statement: "if" "(" <expression> ")" <compound_statement> ["else" <compound_statement>]
| "while" "(" <expression> ")" <compound_statement>
| "for" "each" [ <id> ] <id> "in" <expression> <compound_statement>
| "for" <id> "=" <expression> "to <expression> [ "step" <expression> ] <compound_statement>
| "switch" "(" <expression> ")" "{"
("case" <expression> <compound_statement>)*
[ "default" <compound_statement> ] "}" ";"
| "return" <expression> ";"
| <id_list> [ ":" <id> ] "=" <expression> ";"
| <id_list> "(" <expression_list> ")" ";"
| ";"
expression_list: <expression> ( "," <expression> )*
expression: <expression> "or" <expression>
| <expression> "and" <expression>
| <expression> "=" <expression>
| <expression> "!=" <expression>
| <expression> "lt" <expression>
| <expression> "<" <expression>
| <expression> "le" <expression>
| <expression> "<=;" <expression>
| <expression> "gt" <expression>
| <expression> ">" <expression>
| <expression> "ge" <expression>
| <expression> ">=" <expression>
| <expression> "#" <expression>
| <expression> "&" <expression>
| <expression> "+" <expression>
| <expression> "-" <expression>
| <expression> "/" <expression>
| <expression> "*" <expression>
| <expression> "%" <expression>
| "-" <expression>
| "not" <expression>
| <id_list> [ ":" <id> ]
| <string>
| <integer>
| <float>
| "true"
| "false"
| "self"
| "null"
| "(" <expression> ")"
id_list: <id> [ "(" <expression_list> ")" ]
["[" <expression> "]" ] ( "." <id> [ "(" <expression_list> ")" ])*
Here are the lexical tokens, described as regular expressions:
<integer>: "0" | (["1"-"9"] (["0"-"9"])*)
<character>: "\'" (~["\"","\\","\n","\r"] |
"\\" (["n","t","b","r","f","\\","\'","\""] |
["0"-"7"] (["0"-"7"])? |
["0"-"3"] ["0"-"7"] ["0"-"7"])) "\'"
<string>: "\"" (~["\"","\\","\n","\r"]
| "\\" (["n","t","b","r","f","\\","\'","\""]
| ["0"-"7"] (["0"-"7"])?
| ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "\""
<float>: ((["0"-"9"])+ "." (["0"-"9"])*
| (["0"-"9"])* "." (["0"-"9"])+) ("e" (["-","+"])? (["0"-"9"])+)?
<id>: ["@","$","A"-"Z","_","a"-"z"] ( ["@","$","A"-"Z","_","a"-"z"]
| ["0"-"9"] )*