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"] )*