Warning, /kdevelop/kdevelop-pg-qt/examples/cool/cool.g is written in an unsupported language. File is not indexed.
0001 [: 0002 #include <QString> 0003 0004 :] 0005 ------------------------------------------------------------ 0006 -- Parser class members 0007 ------------------------------------------------------------ 0008 0009 %parserclass (private declaration) 0010 [: 0011 QString m_contents; 0012 :] 0013 0014 %parserclass (public declaration) 0015 [: 0016 /** 0017 * Transform the raw input into tokens. 0018 * When this method returns, the parser's token stream has been filled 0019 * and any parse_*() method can be called. 0020 */ 0021 void tokenize( char *contents ); 0022 0023 enum problem_type { 0024 error, 0025 warning, 0026 info 0027 }; 0028 // void report_problem( Parser::problem_type type, const char* message ); 0029 void report_problem( Parser::problem_type type, const QString & message ); 0030 0031 QString tokenText(qint64 begin, qint64 end); 0032 :] 0033 0034 %parser_declaration_header "coolast.h" 0035 0036 0037 ------------------------------------------------------------ 0038 -- List of defined tokens 0039 ------------------------------------------------------------ 0040 0041 -- keywords: 0042 %token CLASS ("class"), INHERITS ("inherits"), NEW ("new"), 0043 IF ("if"), THEN ("then"), ELSE ("else"), FI ("fi"), WHILE ("while"), 0044 LOOP ("loop"), POOL ("pool"), LET ("let"), IN ("in"), 0045 CASE ("case"), OF ("of"), ESAC ("esac") ;; 0046 0047 -- seperators: 0048 %token LPAREN ("("), RPAREN (")"), LBRACE ("{"), RBRACE ("}"), SEMICOLON (";"), 0049 COMMA (","), DOT ("."), AT ("@") ;; 0050 0051 -- operators: 0052 %token PLUS ("+"), MINUS ("-"), STAR ("*"), SLASH ("/"), EQUAL ("="), 0053 LESS_EQUAL ("<="), LESS ("<"), COLON (":"), ARROW_LEFT ("<-"), 0054 ARROW_RIGHT ("=>"), TILDE ("~"), NOT ("not"), ISVOID ("isvoid") ;; 0055 0056 -- literals and identifiers: 0057 %token IDENTIFIER ("identifier"), TYPE ("type specification"), 0058 INTEGER ("integer literal"), STRING ("string literal"), 0059 TRUE ("true"), FALSE ("false") ;; 0060 0061 -- token that makes the parser fail in any case: 0062 %token INVALID ("invalid token") ;; 0063 0064 0065 0066 ------------------------------------------------------------ 0067 -- Start of the actual grammar 0068 ------------------------------------------------------------ 0069 0070 (#klass=class SEMICOLON)* 0071 -> program ;; 0072 0073 CLASS type=TYPE (INHERITS base_type=TYPE | 0) LBRACE (#feature=feature SEMICOLON)* RBRACE 0074 -> class ;; 0075 0076 name=IDENTIFIER COLON type=TYPE 0077 -> formal ;; 0078 0079 ( ?[: LA(2).kind == Token_LPAREN :] 0080 name=IDENTIFIER LPAREN (#formal=formal @ COMMA | 0) RPAREN 0081 COLON type=TYPE LBRACE expression=expression RBRACE 0082 | 0083 name=IDENTIFIER COLON type=TYPE (ARROW_LEFT expression=expression | 0) 0084 ) 0085 -> feature ;; 0086 0087 ( 0088 ?[: LA(2).kind == Token_ARROW_LEFT :] 0089 name=IDENTIFIER ARROW_LEFT expression=expression -- assignment 0090 | 0091 ?[: LA(2).kind == Token_LPAREN :] 0092 name=IDENTIFIER LPAREN (#argument=expression @ COMMA | 0) RPAREN -- dispatch 0093 | 0094 variable=IDENTIFIER 0095 | integer_literal=INTEGER 0096 | string_literal=STRING 0097 | true_literal=TRUE 0098 | false_literal=FALSE 0099 | NEW new_type=TYPE 0100 | LPAREN expression=expression RPAREN 0101 | if_expression=if_expression 0102 | while_expression=while_expression 0103 | block_expression=block_expression 0104 | let_expression=let_expression 0105 | case_expression=case_expression 0106 ) 0107 -> primary_expression ;; 0108 0109 op=TILDE expression=primary_expression -- ^tilde_expression 0110 | op=NOT expression=primary_expression -- ^not_expression 0111 | op=ISVOID expression=primary_expression -- ^isvoid_expression 0112 | expression=primary_expression 0113 -> unary_expression ;; 0114 0115 base_expression=unary_expression 0116 (AT at_type=TYPE DOT name=IDENTIFIER LPAREN (#arguments=expression @ COMMA | 0) RPAREN 0117 | DOT name=IDENTIFIER LPAREN (#arguments=expression @ COMMA | 0) RPAREN 0118 )* 0119 -> postfix_expression ;; 0120 0121 #expression=postfix_expression @ (op=STAR | op=SLASH) 0122 -> multiplicative_expression ;; 0123 0124 #expression=multiplicative_expression @ (op=PLUS | op=MINUS) 0125 -> additive_expression ;; 0126 0127 #expression=additive_expression @ (op=EQUAL | op=LESS_EQUAL | op=LESS) 0128 -> relational_expression ;; 0129 0130 IF condition=expression THEN true_expression=expression ELSE false_expression=expression FI 0131 -> if_expression ;; 0132 0133 WHILE condition=expression LOOP loop_expression=expression POOL 0134 -> while_expression ;; 0135 0136 LBRACE (#expression=expression SEMICOLON)* RBRACE 0137 -> block_expression ;; 0138 0139 LET #declaration=let_declaration @ COMMA IN body_expression=expression 0140 -> let_expression ;; 0141 0142 CASE expression=expression OF (#condition=case_condition SEMICOLON)* ESAC 0143 -> case_expression ;; 0144 0145 .=relational_expression 0146 -> expression ;; 0147 0148 name=IDENTIFIER COLON type=TYPE (ARROW_LEFT expression=expression | 0) 0149 -> let_declaration ;; 0150 0151 name=IDENTIFIER COLON type=TYPE ARROW_RIGHT expression=expression 0152 -> case_condition ;; 0153 0154 0155 0156 0157 ----------------------------------------------------------------- 0158 -- Code segments copied to the implementation (.cpp) file. 0159 -- If existent, kdevelop-pg's current syntax requires this block 0160 -- to occur at the end of the file. 0161 ----------------------------------------------------------------- 0162 0163 [: 0164 #include "cool_lexer.h" 0165 0166 0167 namespace cool 0168 { 0169 0170 void Parser::tokenize( char *contents ) 0171 { 0172 m_contents = contents; 0173 Lexer lexer( this, contents ); 0174 0175 int kind = Parser::Token_EOF; 0176 do 0177 { 0178 kind = lexer.yylex(); 0179 //std::cerr << lexer.YYText() << std::endl; //" "; // debug output 0180 0181 if ( !kind ) // when the lexer returns 0, the end of file is reached 0182 kind = Parser::Token_EOF; 0183 0184 Parser::Token &t = this->tokenStream->push(); 0185 t.kind = kind; 0186 t.begin = lexer.tokenBegin(); 0187 t.end = lexer.tokenEnd(); 0188 // t.text = contents; 0189 } 0190 while ( kind != Parser::Token_EOF ); 0191 0192 this->yylex(); // produce the look ahead token 0193 } 0194 0195 QString Parser::tokenText(qint64 begin, qint64 end) 0196 { 0197 return m_contents.mid(begin,end-begin+1); 0198 } 0199 0200 0201 } // end of namespace cool 0202 0203 :]