* helper rules, not part of the official language syntax
*/
-digit_oct
- '0'-'7';
-
-digit_dec
- '0'-'9';
-
-digit_hex
- '0'-'9' .or 'A'-'F' .or 'a'-'f';
-
-id_character_first
- 'a'-'z' .or 'A'-'Z' .or '_';
-
-id_character_next
- id_character_first .or digit_dec;
-
identifier
- id_character_first .emit * .and .loop id_character_next .emit * .and .true .emit '\0';
+ "@ID" .emit *;
float
- float_1 .or float_2 .or float_3;
-float_1
- float_fractional_constant .and float_optional_exponent_part .and optional_f_suffix;
-float_2
- float_digit_sequence .and .true .emit '\0' .and float_exponent_part .and optional_f_suffix;
-float_3
- float_digit_sequence .and .true .emit '\0' .and 'f' .emit '\0';
-
-float_fractional_constant
- float_fractional_constant_1 .or float_fractional_constant_2 .or float_fractional_constant_3;
-float_fractional_constant_1
- float_digit_sequence .and '.' .and float_digit_sequence;
-float_fractional_constant_2
- float_digit_sequence .and '.' .and .true .emit '\0';
-float_fractional_constant_3
- '.' .emit '\0' .and float_digit_sequence;
-
-float_optional_exponent_part
- float_exponent_part .or .true .emit '\0';
-
-float_digit_sequence
- digit_dec .emit * .and .loop digit_dec .emit * .and .true .emit '\0';
-
-float_exponent_part
- float_exponent_part_1 .or float_exponent_part_2;
-float_exponent_part_1
- 'e' .and float_optional_sign .and float_digit_sequence;
-float_exponent_part_2
- 'E' .and float_optional_sign .and float_digit_sequence;
-
-float_optional_sign
- float_sign .or .true;
-
-float_sign
- '+' .or '-' .emit '-';
-
-optional_f_suffix
- 'f' .or .true;
-
+ "@NUM" .emit *;
integer
- integer_hex .or integer_oct .or integer_dec;
-
-integer_hex
- '0' .and integer_hex_1 .emit 0x10 .and digit_hex .emit * .and .loop digit_hex .emit * .and
- .true .emit '\0';
-integer_hex_1
- 'x' .or 'X';
-
-integer_oct
- '0' .emit 8 .emit * .and .loop digit_oct .emit * .and .true .emit '\0';
-
-integer_dec
- digit_dec .emit 10 .emit * .and .loop digit_dec .emit * .and .true .emit '\0';
+ "@NUM" .emit *;
boolean
- "true" .emit 2 .emit '1' .emit '\0' .or
- "false" .emit 2 .emit '0' .emit '\0';
+ "true" .emit '1' .emit '\0' .or
+ "false" .emit '0' .emit '\0';
type_name
identifier;
boolean .emit OP_PUSH_BOOL;
optional_space
- .loop single_space;
+ .true;
space
- single_space .and .loop single_space;
-
-single_space
- white_char .or c_style_comment_block .or cpp_style_comment_block;
-
-white_char
- ' ' .or '\t' .or new_line .or '\v' .or '\f';
-
-new_line
- cr_lf .or lf_cr .or '\n' .or '\r';
-
-cr_lf
- '\r' .and '\n';
-
-lf_cr
- '\n' .and '\r';
-
-c_style_comment_block
- '/' .and '*' .and c_style_comment_rest;
-
-c_style_comment_rest
- .loop c_style_comment_char_no_star .and c_style_comment_rest_1;
-c_style_comment_rest_1
- c_style_comment_end .or c_style_comment_rest_2;
-c_style_comment_rest_2
- '*' .and c_style_comment_rest;
-
-c_style_comment_char_no_star
- '\x2B'-'\xFF' .or '\x01'-'\x29';
-
-c_style_comment_end
- '*' .and '/';
-
-cpp_style_comment_block
- '/' .and '/' .and cpp_style_comment_block_1;
-cpp_style_comment_block_1
- cpp_style_comment_block_2 .or cpp_style_comment_block_3;
-cpp_style_comment_block_2
- .loop cpp_style_comment_char .and new_line;
-cpp_style_comment_block_3
- .loop cpp_style_comment_char;
-
-cpp_style_comment_char
- '\x0E'-'\xFF' .or '\x01'-'\x09' .or '\x0B'-'\x0C';
+ .true;
/* lexical rules */
optional_space .and '&' .and optional_space;*/
ampersandampersand
- optional_space .and '&' .and '&' .and optional_space;
+ "@&&";
/*ampersandequals
optional_space .and '&' .and '=' .and optional_space;*/
optional_space .and '|' .and optional_space;*/
barbar
- optional_space .and '|' .and '|' .and optional_space;
+ "@||";
/*barequals
optional_space .and '|' .and '=' .and optional_space;*/
bang
- optional_space .and '!' .and optional_space;
+ "@!";
bangequals
- optional_space .and '!' .and '=' .and optional_space;
+ "@!=";
/*caret
optional_space .and '^' .and optional_space;*/
caretcaret
- optional_space .and '^' .and '^' .and optional_space;
+ "@^^";
/*caretequals
optional_space .and '^' .and '=' .and optional_space;*/
colon
- optional_space .and ':' .and optional_space;
+ "@:";
comma
- optional_space .and ',' .and optional_space;
+ "@,";
dot
- optional_space .and '.' .and optional_space;
+ "@.";
equals
- optional_space .and '=' .and optional_space;
+ "@=";
equalsequals
- optional_space .and '=' .and '=' .and optional_space;
+ "@==";
greater
- optional_space .and '>' .and optional_space;
+ "@>";
greaterequals
- optional_space .and '>' .and '=' .and optional_space;
+ "@>=";
/*greatergreater
optional_space .and '>' .and '>' .and optional_space;*/
optional_space .and '>' .and '>' .and '=' .and optional_space;*/
lbrace
- optional_space .and '{' .and optional_space;
+ "@{";
lbracket
- optional_space .and '[' .and optional_space;
+ "@[";
less
- optional_space .and '<' .and optional_space;
+ "@<";
lessequals
- optional_space .and '<' .and '=' .and optional_space;
+ "@<=";
/*lessless
optional_space .and '<' .and '<' .and optional_space;*/
optional_space .and '<' .and '<' .and '=' .and optional_space;*/
lparen
- optional_space .and '(' .and optional_space;
+ "@(";
minus
- optional_space .and '-' .and optional_space;
+ "@-";
minusequals
- optional_space .and '-' .and '=' .and optional_space;
+ "@-=";
minusminus
- optional_space .and '-' .and '-' .and optional_space;
+ "@--";
/*percent
optional_space .and '%' .and optional_space;*/
optional_space .and '%' .and '=' .and optional_space;*/
plus
- optional_space .and '+' .and optional_space;
+ "@+";
plusequals
- optional_space .and '+' .and '=' .and optional_space;
+ "@+=";
plusplus
- optional_space .and '+' .and '+' .and optional_space;
+ "@++";
question
- optional_space .and '?' .and optional_space;
+ "@?";
rbrace
- optional_space .and '}' .and optional_space;
+ "@}";
rbracket
- optional_space .and ']' .and optional_space;
+ "@]";
rparen
- optional_space .and ')' .and optional_space;
+ "@)";
semicolon
- optional_space .and ';' .and optional_space;
+ "@;";
slash
- optional_space .and '/' .and optional_space;
+ "@/";
slashequals
- optional_space .and '/' .and '=' .and optional_space;
+ "@/=";
star
- optional_space .and '*' .and optional_space;
+ "@*";
starequals
- optional_space .and '*' .and '=' .and optional_space;
+ "@*=";
/*tilde
optional_space .and '~' .and optional_space;*/
-/* string rules - these are used internally by the parser when parsing quoted strings */
-
-.string string_lexer;
-
-string_lexer
- lex_first_identifier_character .and .loop lex_next_identifier_character;
-
-lex_first_identifier_character
- 'a'-'z' .or 'A'-'Z' .or '_';
-
-lex_next_identifier_character
- 'a'-'z' .or 'A'-'Z' .or '0'-'9' .or '_';
-
-/* error rules - these are used by error messages */
-
-err_token
- '~' .or '`' .or '!' .or '@' .or '#' .or '$' .or '%' .or '^' .or '&' .or '*' .or '(' .or ')' .or
- '-' .or '+' .or '=' .or '|' .or '\\' .or '[' .or ']' .or '{' .or '}' .or ':' .or ';' .or '"' .or
- '\'' .or '<' .or ',' .or '>' .or '.' .or '/' .or '?' .or err_identifier;
-
-err_identifier
- id_character_first .and .loop id_character_next;
-
" \"invariant\" .and space .and identifier .and semicolon;\n"
"function_definition\n"
" function_prototype .and compound_statement_no_new_scope;\n"
-"digit_oct\n"
-" '0'-'7';\n"
-"digit_dec\n"
-" '0'-'9';\n"
-"digit_hex\n"
-" '0'-'9' .or 'A'-'F' .or 'a'-'f';\n"
-"id_character_first\n"
-" 'a'-'z' .or 'A'-'Z' .or '_';\n"
-"id_character_next\n"
-" id_character_first .or digit_dec;\n"
"identifier\n"
-" id_character_first .emit * .and .loop id_character_next .emit * .and .true .emit '\\0';\n"
+" \"@ID\" .emit *;\n"
"float\n"
-" float_1 .or float_2 .or float_3;\n"
-"float_1\n"
-" float_fractional_constant .and float_optional_exponent_part .and optional_f_suffix;\n"
-"float_2\n"
-" float_digit_sequence .and .true .emit '\\0' .and float_exponent_part .and optional_f_suffix;\n"
-"float_3\n"
-" float_digit_sequence .and .true .emit '\\0' .and 'f' .emit '\\0';\n"
-"float_fractional_constant\n"
-" float_fractional_constant_1 .or float_fractional_constant_2 .or float_fractional_constant_3;\n"
-"float_fractional_constant_1\n"
-" float_digit_sequence .and '.' .and float_digit_sequence;\n"
-"float_fractional_constant_2\n"
-" float_digit_sequence .and '.' .and .true .emit '\\0';\n"
-"float_fractional_constant_3\n"
-" '.' .emit '\\0' .and float_digit_sequence;\n"
-"float_optional_exponent_part\n"
-" float_exponent_part .or .true .emit '\\0';\n"
-"float_digit_sequence\n"
-" digit_dec .emit * .and .loop digit_dec .emit * .and .true .emit '\\0';\n"
-"float_exponent_part\n"
-" float_exponent_part_1 .or float_exponent_part_2;\n"
-"float_exponent_part_1\n"
-" 'e' .and float_optional_sign .and float_digit_sequence;\n"
-"float_exponent_part_2\n"
-" 'E' .and float_optional_sign .and float_digit_sequence;\n"
-"float_optional_sign\n"
-" float_sign .or .true;\n"
-"float_sign\n"
-" '+' .or '-' .emit '-';\n"
-"optional_f_suffix\n"
-" 'f' .or .true;\n"
+" \"@NUM\" .emit *;\n"
"integer\n"
-" integer_hex .or integer_oct .or integer_dec;\n"
-"integer_hex\n"
-" '0' .and integer_hex_1 .emit 0x10 .and digit_hex .emit * .and .loop digit_hex .emit * .and\n"
-" .true .emit '\\0';\n"
-"integer_hex_1\n"
-" 'x' .or 'X';\n"
-"integer_oct\n"
-" '0' .emit 8 .emit * .and .loop digit_oct .emit * .and .true .emit '\\0';\n"
-"integer_dec\n"
-" digit_dec .emit 10 .emit * .and .loop digit_dec .emit * .and .true .emit '\\0';\n"
+" \"@NUM\" .emit *;\n"
"boolean\n"
-" \"true\" .emit 2 .emit '1' .emit '\\0' .or\n"
-" \"false\" .emit 2 .emit '0' .emit '\\0';\n"
+" \"true\" .emit '1' .emit '\\0' .or\n"
+" \"false\" .emit '0' .emit '\\0';\n"
"type_name\n"
" identifier;\n"
"field_selection\n"
"boolconstant\n"
" boolean .emit OP_PUSH_BOOL;\n"
"optional_space\n"
-" .loop single_space;\n"
+" .true;\n"
"space\n"
-" single_space .and .loop single_space;\n"
-"single_space\n"
-" white_char .or c_style_comment_block .or cpp_style_comment_block;\n"
-"white_char\n"
-" ' ' .or '\\t' .or new_line .or '\\v' .or '\\f';\n"
-"new_line\n"
-" cr_lf .or lf_cr .or '\\n' .or '\\r';\n"
-"cr_lf\n"
-" '\\r' .and '\\n';\n"
-"lf_cr\n"
-" '\\n' .and '\\r';\n"
-"c_style_comment_block\n"
-" '/' .and '*' .and c_style_comment_rest;\n"
-"c_style_comment_rest\n"
-" .loop c_style_comment_char_no_star .and c_style_comment_rest_1;\n"
-"c_style_comment_rest_1\n"
-" c_style_comment_end .or c_style_comment_rest_2;\n"
-"c_style_comment_rest_2\n"
-" '*' .and c_style_comment_rest;\n"
-"c_style_comment_char_no_star\n"
-" '\\x2B'-'\\xFF' .or '\\x01'-'\\x29';\n"
-"c_style_comment_end\n"
-" '*' .and '/';\n"
-"cpp_style_comment_block\n"
-" '/' .and '/' .and cpp_style_comment_block_1;\n"
-"cpp_style_comment_block_1\n"
-" cpp_style_comment_block_2 .or cpp_style_comment_block_3;\n"
-"cpp_style_comment_block_2\n"
-" .loop cpp_style_comment_char .and new_line;\n"
-"cpp_style_comment_block_3\n"
-" .loop cpp_style_comment_char;\n"
-"cpp_style_comment_char\n"
-" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"
+" .true;\n"
"ampersandampersand\n"
-" optional_space .and '&' .and '&' .and optional_space;\n"
+" \"@&&\";\n"
"barbar\n"
-" optional_space .and '|' .and '|' .and optional_space;\n"
+" \"@||\";\n"
"bang\n"
-" optional_space .and '!' .and optional_space;\n"
+" \"@!\";\n"
"bangequals\n"
-" optional_space .and '!' .and '=' .and optional_space;\n"
+" \"@!=\";\n"
"caretcaret\n"
-" optional_space .and '^' .and '^' .and optional_space;\n"
+" \"@^^\";\n"
"colon\n"
-" optional_space .and ':' .and optional_space;\n"
+" \"@:\";\n"
"comma\n"
-" optional_space .and ',' .and optional_space;\n"
+" \"@,\";\n"
"dot\n"
-" optional_space .and '.' .and optional_space;\n"
+" \"@.\";\n"
"equals\n"
-" optional_space .and '=' .and optional_space;\n"
+" \"@=\";\n"
"equalsequals\n"
-" optional_space .and '=' .and '=' .and optional_space;\n"
+" \"@==\";\n"
"greater\n"
-" optional_space .and '>' .and optional_space;\n"
+" \"@>\";\n"
"greaterequals\n"
-" optional_space .and '>' .and '=' .and optional_space;\n"
+" \"@>=\";\n"
"lbrace\n"
-" optional_space .and '{' .and optional_space;\n"
+" \"@{\";\n"
"lbracket\n"
-" optional_space .and '[' .and optional_space;\n"
+" \"@[\";\n"
"less\n"
-" optional_space .and '<' .and optional_space;\n"
+" \"@<\";\n"
"lessequals\n"
-" optional_space .and '<' .and '=' .and optional_space;\n"
+" \"@<=\";\n"
"lparen\n"
-" optional_space .and '(' .and optional_space;\n"
+" \"@(\";\n"
"minus\n"
-" optional_space .and '-' .and optional_space;\n"
+" \"@-\";\n"
"minusequals\n"
-" optional_space .and '-' .and '=' .and optional_space;\n"
+" \"@-=\";\n"
"minusminus\n"
-" optional_space .and '-' .and '-' .and optional_space;\n"
+" \"@--\";\n"
"plus\n"
-" optional_space .and '+' .and optional_space;\n"
+" \"@+\";\n"
"plusequals\n"
-" optional_space .and '+' .and '=' .and optional_space;\n"
+" \"@+=\";\n"
"plusplus\n"
-" optional_space .and '+' .and '+' .and optional_space;\n"
+" \"@++\";\n"
"question\n"
-" optional_space .and '?' .and optional_space;\n"
+" \"@?\";\n"
"rbrace\n"
-" optional_space .and '}' .and optional_space;\n"
+" \"@}\";\n"
"rbracket\n"
-" optional_space .and ']' .and optional_space;\n"
+" \"@]\";\n"
"rparen\n"
-" optional_space .and ')' .and optional_space;\n"
+" \"@)\";\n"
"semicolon\n"
-" optional_space .and ';' .and optional_space;\n"
+" \"@;\";\n"
"slash\n"
-" optional_space .and '/' .and optional_space;\n"
+" \"@/\";\n"
"slashequals\n"
-" optional_space .and '/' .and '=' .and optional_space;\n"
+" \"@/=\";\n"
"star\n"
-" optional_space .and '*' .and optional_space;\n"
+" \"@*\";\n"
"starequals\n"
-" optional_space .and '*' .and '=' .and optional_space;\n"
-".string string_lexer;\n"
-"string_lexer\n"
-" lex_first_identifier_character .and .loop lex_next_identifier_character;\n"
-"lex_first_identifier_character\n"
-" 'a'-'z' .or 'A'-'Z' .or '_';\n"
-"lex_next_identifier_character\n"
-" 'a'-'z' .or 'A'-'Z' .or '0'-'9' .or '_';\n"
-"err_token\n"
-" '~' .or '`' .or '!' .or '@' .or '#' .or '$' .or '%' .or '^' .or '&' .or '*' .or '(' .or ')' .or\n"
-" '-' .or '+' .or '=' .or '|' .or '\\\\' .or '[' .or ']' .or '{' .or '}' .or ':' .or ';' .or '\"' .or\n"
-" '\\'' .or '<' .or ',' .or '>' .or '.' .or '/' .or '?' .or err_identifier;\n"
-"err_identifier\n"
-" id_character_first .and .loop id_character_next;\n"
+" \"@*=\";\n"
""