From 0e7b1d88118621c34f6a7b64abf3ff4b2ff20679 Mon Sep 17 00:00:00 2001 From: Michal Krol Date: Wed, 3 Mar 2004 18:10:40 +0000 Subject: Grammar package supporting 8-bit registers. TODO: - add checking for duplicate symbols (or is it done already?) - move all the statics (grammar objects list and last error message) to the GL context state; I think simple pointer initialized in a first call to ProgramString() is sufficent. - apply an optimized version of match() - this will be needed for glslang compiler. --- src/mesa/shader/grammar.syn | 522 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 522 insertions(+) create mode 100644 src/mesa/shader/grammar.syn (limited to 'src/mesa/shader/grammar.syn') diff --git a/src/mesa/shader/grammar.syn b/src/mesa/shader/grammar.syn new file mode 100644 index 0000000000..62141df175 --- /dev/null +++ b/src/mesa/shader/grammar.syn @@ -0,0 +1,522 @@ +.syntax grammar; + +/* declaration */ +.emtcode DECLARATION_END 0x00 +.emtcode DECLARATION_EMITCODE 0x01 +.emtcode DECLARATION_ERRORTEXT 0x02 +.emtcode DECLARATION_REGBYTE 0x03 +.emtcode DECLARATION_LEXER 0x04 +.emtcode DECLARATION_RULE 0x05 + +/* specifier */ +.emtcode SPECIFIER_END 0x00 +.emtcode SPECIFIER_AND_TAG 0x01 +.emtcode SPECIFIER_OR_TAG 0x02 +.emtcode SPECIFIER_CHARACTER_RANGE 0x03 +.emtcode SPECIFIER_CHARACTER 0x04 +.emtcode SPECIFIER_STRING 0x05 +.emtcode SPECIFIER_IDENTIFIER 0x06 +.emtcode SPECIFIER_TRUE 0x07 +.emtcode SPECIFIER_FALSE 0x08 +.emtcode SPECIFIER_DEBUG 0x09 + +/* identifier */ +.emtcode IDENTIFIER_NO_LOOP 0x00 +.emtcode IDENTIFIER_LOOP 0x01 + +/* error */ +.emtcode ERROR_NOT_PRESENT 0x00 +.emtcode ERROR_PRESENT 0x01 + +/* emit */ +.emtcode EMIT_NULL 0x00 +.emtcode EMIT_INTEGER 0x01 +.emtcode EMIT_IDENTIFIER 0x02 +.emtcode EMIT_CHARACTER 0x03 +.emtcode EMIT_LAST_CHARACTER 0x04 +.emtcode EMIT_CURRENT_POSITION 0x05 + +.errtext INVALID_GRAMMAR "internal error 2001: invalid grammar script" +.errtext SYNTAX_EXPECTED "internal error 2002: '.syntax' keyword expected" +.errtext IDENTIFIER_EXPECTED "internal error 2003: identifier expected" +.errtext MISSING_SEMICOLON "internal error 2004: missing ';'" +.errtext INTEGER_EXPECTED "internal error 2005: integer value expected" +.errtext STRING_EXPECTED "internal error 2006: string expected" + +/* + ::= ".syntax" ";" +*/ +grammar + grammar_1 .error INVALID_GRAMMAR; +grammar_1 + optional_space .and ".syntax" .error SYNTAX_EXPECTED .and space .and identifier .and + semicolon .and declaration_list .and optional_space .and '\0' .emit DECLARATION_END; + +/* + ::= + | "" +*/ +optional_space + space .or .true; + +/* + ::= * +*/ +space + single_space .and .loop single_space; + +/* + ::= + | +*/ +single_space + white_char .or comment_block; + +/* + ::= " " + | "\t" + | "\n" + | "\r" +*/ +white_char + ' ' .or '\t' .or '\n' .or '\r'; + +/* + ::= "/" "*" * "*" "/" +*/ +comment_block + '/' .and '*' .and .loop comment_char .and '*' .and '/'; + +/* + ::= + | "*" +*/ +comment_char + comment_char_no_star .or comment_char_1; +comment_char_1 + '*' .and comment_char_no_slash; + +/* + ::= All ASCII characters except "*" and "\0" +*/ +comment_char_no_star + '\x2B'-'\xFF' .or '\x01'-'\x29'; + +/* + ::= All ASCII characters except "/" and "\0" +*/ +comment_char_no_slash + '\x30'-'\xFF' .or '\x01'-'\x2E'; + +/* + ::= +*/ +identifier + identifier_ne .error IDENTIFIER_EXPECTED; + +/* + ::= * +*/ +identifier_ne + first_idchar .emit * .and .loop follow_idchar .emit * .and .true .emit '\0'; + +/* + ::= "a"-"z" + | "A"-"Z" + | "_" +*/ +first_idchar + 'a'-'z' .or 'A'-'Z' .or '_'; + +/* + ::= + | +*/ +follow_idchar + first_idchar .or digit_dec; + +/* + ::= "0"-"9" +*/ +digit_dec + '0'-'9'; + +/* + ::= ";" +*/ +semicolon + optional_space .and ';' .error MISSING_SEMICOLON .and optional_space; + +/* + ::= + | +*/ +declaration_list + declaration .and .loop declaration; + +/* + ::= + | + | + | +*/ +declaration + emitcode_definition .emit DECLARATION_EMITCODE .or + errortext_definition .emit DECLARATION_ERRORTEXT .or + regbyte_definition .emit DECLARATION_REGBYTE .or + lexer_definition .emit DECLARATION_LEXER .or + rule_definition .emit DECLARATION_RULE; + +/* + ::= ".emtcode" +*/ +emitcode_definition + ".emtcode" .and space .and identifier .and space .and integer .and space_or_null; + +/* + ::= +*/ +integer + integer_ne .error INTEGER_EXPECTED; + +/* + :: * +*/ +integer_ne + hex_prefix .and digit_hex .emit * .and .loop digit_hex .emit * .and .true .emit '\0'; + +/* + ::= "0x" + | "0X" +*/ +hex_prefix + '0' .and hex_prefix_1; +hex_prefix_1 + 'x' .or 'X'; + +/* + ::= "0"-"9" + | "a"-"f" + | "A"-"F" +*/ +digit_hex + '0'-'9' .or 'a'-'f' .or 'A'-'F'; + +/* + ::= + | "\0" +*/ +space_or_null + space .or '\0'; + +/* + ::= ".errtext" +*/ +errortext_definition + ".errtext" .and space .and identifier .and space .and string .and space_or_null; + +/* + ::= +*/ +string + string_ne .error STRING_EXPECTED; + +/* + ::= "\"" "\"" +*/ +string_ne + '"' .and .loop string_char_double_quotes .and '"' .emit '\0'; + +/* + ::= + | + | "\'" +*/ +string_char_double_quotes + escape_sequence .or string_char .emit * .or '\'' .emit *; + +/* + ::= All ASCII characters except "\'", "\"", "\n", "\r", + "\0" and "\\" +*/ +string_char + '\x5D'-'\xFF' .or '\x28'-'\x5B' .or '\x23'-'\x26' .or '\x0E'-'\x21' .or '\x0B'-'\x0C' .or + '\x01'-'\x09'; + +/* + ::= "\\" +*/ +escape_sequence + '\\' .emit * .and escape_code; + +/* + ::= + | + | +*/ +escape_code + simple_escape_code .emit * .or hex_escape_code .or oct_escape_code; + +/* + ::= "\'" + | "\"" + | "?" + | "\\" + | "a" + | "b" + | "f" + | "n" + | "r" + | "t" + | "v" +*/ +simple_escape_code + '\'' .or '"' .or '?' .or '\\' .or 'a' .or 'b' .or 'f' .or 'n' .or 'r' .or 't' .or 'v'; + +/* + ::= "x" * +*/ +hex_escape_code + 'x' .emit * .and digit_hex .emit * .and .loop digit_hex .emit *; + +/* + ::= +*/ +oct_escape_code + digit_oct .emit * .and optional_digit_oct .and optional_digit_oct; + +/* + ::= "0"-"7" +*/ +digit_oct + '0'-'7'; + +/* + ::= + | "" +*/ +optional_digit_oct + digit_oct .emit * .or .true; + +/* + ::= ".regbyte" +*/ +regbyte_definition + ".regbyte" .and space .and identifier .and space .and integer .and space_or_null; + +/* + ::= ".string" ";" +*/ +lexer_definition + ".string" .and space .and identifier .and semicolon; + +/* + ::= +*/ +rule_definition + identifier_ne .and space .and definition; + +/* + ::= ";" +*/ +definition + specifier .and optional_specifiers_and_or .and semicolon .emit SPECIFIER_END; + +/* + ::= + | + | "" +*/ +optional_specifiers_and_or + and_specifiers .emit SPECIFIER_AND_TAG .or or_specifiers .emit SPECIFIER_OR_TAG .or .true; + +/* + ::= +*/ +specifier + specifier_condition .and optional_space .and specifier_rule; + +/* + ::= ".if" "(" ")" +*/ +specifier_condition + specifier_condition_1 .or .true; +specifier_condition_1 + ".if" .and optional_space .and '(' .and optional_space .and left_operand .and operator .and + right_operand .and optional_space .and ')'; + +/* + ::= +*/ +left_operand + identifier; + +/* + ::= "!=" + | "==" +*/ +operator + operator_1 .or operator_2; +operator_1 + optional_space .and '!' .and '=' .and optional_space; +operator_2 + optional_space .and '=' .and '=' .and optional_space; + +/* + ::= +*/ +right_operand + integer; + +/* + ::= * + | * + | * + | * + | ".true" * + | ".false" * + | ".debug" * +*/ +specifier_rule + specifier_rule_1 .and optional_error .and .loop emit .and .true .emit EMIT_NULL; +specifier_rule_1 + character_range .emit SPECIFIER_CHARACTER_RANGE .or + character .emit SPECIFIER_CHARACTER .or + string_ne .emit SPECIFIER_STRING .or + ".true" .emit SPECIFIER_TRUE .or + ".false" .emit SPECIFIER_FALSE .or + ".debug" .emit SPECIFIER_DEBUG .or + loop_identifier .emit SPECIFIER_IDENTIFIER; + +/* + ::= "\'" ::= + | + | "\"" +*/ +string_char_single_quotes + escape_sequence .or string_char .emit * .or '"' .emit *; + +/* + ::= "-" +*/ +character_range + character .and optional_space .and '-' .and optional_space .and character; + +/* + ::= +*/ +loop_identifier + optional_loop .and identifier; + +/* + ::= ".loop" + | "" +*/ +optional_loop + optional_loop_1 .emit IDENTIFIER_LOOP .or .true .emit IDENTIFIER_NO_LOOP; +optional_loop_1 + ".loop" .and space; + +/* + ::= + | "" +*/ +optional_error + error .emit ERROR_PRESENT .or .true .emit ERROR_NOT_PRESENT; + +/* + :: ".error" +*/ +error + space .and ".error" .and space .and identifier; + +/* + ::= + | +*/ +emit + emit_output .or emit_regbyte; + +/* + ::= ".emit" +*/ +emit_output + space .and ".emit" .and space .and emit_param; + +/* + ::= + | + | + | "*" + | "$" +*/ +emit_param + integer_ne .emit EMIT_INTEGER .or + identifier_ne .emit EMIT_IDENTIFIER .or + character .emit EMIT_CHARACTER .or + '*' .emit EMIT_LAST_CHARACTER .or + '$' .emit EMIT_CURRENT_POSITION; + +/* + ::= ".load" +*/ +emit_regbyte + space .and ".load" .and space .and identifier .and space .and emit_param; + +/* + ::= * +*/ +and_specifiers + and_specifier .and .loop and_specifier; + +/* + ::= * +*/ +or_specifiers + or_specifier .and .loop or_specifier; + +/* + ::= ".and" +*/ +and_specifier + space .and ".and" .and space .and specifier; + +/* + ::= ".or" +*/ +or_specifier + space .and ".or" .and space .and specifier; + + +.string __string_filter; + +/* + <__string_filter> ::= <__first_identifier_char> <__next_identifier_char>* +*/ +__string_filter + __first_identifier_char .and .loop __next_identifier_char; + +/* + <__first_identifier_char> ::= "a"-"z" + | "A"-"Z" + | "_" + | "." +*/ +__first_identifier_char + 'a'-'z' .or 'A'-'Z' .or '_' .or '.'; + +/* + <__next_identifier_char> ::= "a"-"z" + | "A"-"Z" + | "_" + | "0"-"9" +*/ +__next_identifier_char + 'a'-'z' .or 'A'-'Z' .or '_' .or '0'-'9'; + -- cgit v1.2.3