Warning, /kdevelop/kdevelop-pg-qt/examples/cc/cc.g is written in an unsupported language. File is not indexed.

0001 --   Copyright (C) 2005 Roberto Raggi <roberto@kdevelop.org>
0002 --   Copyright (C) 2009 Jonathan Schmidt-Dominé <devel@the-user.org>
0003 --
0004 --   This library is free software; you can redistribute it and/or
0005 --   modify it under the terms of the GNU Library General Public
0006 --   License as published by the Free Software Foundation; either
0007 --   version 2 of the License, or (at your option) any later version.
0008 --
0009 --   This library is distributed in the hope that it will be useful,
0010 --   but WITHOUT ANY WARRANTY; without even the implied warranty of
0011 --   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0012 --   Library General Public License for more details.
0013 --
0014 --   You should have received a copy of the GNU Library General Public License
0015 --   along with this library; see the file COPYING.LIB.  If not, write to
0016 --   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
0017 --   Boston, MA 02111-1307, USA.
0018 
0019 [:
0020 #include <QString>
0021 #include <QDebug>
0022 :]
0023 
0024 %parserclass (protected declaration)
0025 [:
0026 void expectedSymbol(cc::AstNode::AstNodeKind kind, const QString& name) { qWarning() << "In AstNode " << kind << ": Expected symbol " << name; }
0027 void expectedToken(int kind, enum TokenType token, const QString& name) { qWarning() << "In AstNode " << kind << ": Expected token " << name << " (" << token << ")";}
0028 struct ParserState {
0029   int ltCounter;
0030 };
0031 ParserState m_state;
0032 :]
0033 
0034 %parser_declaration_header "ccast.h"
0035 
0036 ------------------------------------------------------------
0037 -- T O K E N   L I S T
0038 ------------------------------------------------------------
0039 
0040 -- keywords:
0041 %token CASE ("case"), DEFAULT ("default"), IF ("if"), ELSE ("else"),
0042        SWITCH ("switch"), WHILE ("while"), DO ("do"), FOR ("for"),
0043        BREAK ("break"), CONTINUE ("continue"), GOTO ("goto"),
0044        RETURN ("return"), TYPEDEF ("typedef"), EXTERN ("extern"),
0045        STATIC ("static"), AUTO ("auto"), REGISTER ("register"), VOID ("void"),
0046        CHAR ("char"), SHORT ("short"), INT ("int"), LONG ("long"),
0047        FLOAT ("float"), DOUBLE ("double"), SIGNED ("signed"),
0048        UNSIGNED ("unsigned"), TYPEDEF_NAME ("pre-defined type specification"),
0049        STRUCT ("struct"), UNION ("union"), ENUM ("enum"), CONST ("const"),
0050        VOLATILE ("volatile") ;;
0051 
0052 -- seperators:
0053 %token LPAREN ("("), RPAREN (")"), LBRACE ("{"), RBRACE ("}"), LBRACKET ("["),
0054        RBRACKET ("]"), DOT ("."), ARROW ("->"), COLON (":"), COMMA (","),
0055        SEMICOLON (";") ;;
0056 
0057 -- operators:
0058 %token PLUS ("+"), MINUS ("-"), STAR ("*"), DIVIDE ("/"), REMAINDER ("%"),
0059        TILDE ("~"), AND ("&"), OR ("|"), XOR ("^"), NOT ("!"),
0060        SIZEOF ("sizeof"), PLUS_PLUS ("++"), MINUS_MINUS ("--"), LSHIFT ("<<"),
0061        RSHIFT (">>"), AND_AND ("&&"), OR_OR ("||"), QUESTION ("?"),
0062        EQUAL ("="), PLUS_EQUAL ("+="), MINUS_EQUAL ("-="), STAR_EQUAL ("*="),
0063        DIVIDE_EQUAL ("/="), REMAINDER_EQUAL ("%="), AND_EQUAL ("&="),
0064        OR_EQUAL ("|="), XOR_EQUAL ("^="), LSHIFT_EQUAL ("<<="),
0065        RSHIFT_EQUAL (">>="), EQUAL_EQUAL ("=="), NOT_EQUAL ("!="),
0066        LESS ("<"), GREATER (">"), LESS_EQUAL ("<="), GREATER_EQUAL (">="),
0067        ELLIPSIS ("...") ;;
0068 
0069 -- identifiers and literals:
0070 %token IDENTIFIER ("identifier"), STRING_LITERAL ("string literal"),
0071        X_CONSTANT ;;
0072        
0073 -- GCC extensions
0074 %token INLINE ("inline"), EXTENSION ("__extension__"), ASM ("asm") ;;
0075 
0076 
0077 
0078 
0079 ------------------------------------------------------------
0080 -- E X T E R N A L    D E C L A R A T I O N S
0081 ------------------------------------------------------------
0082    (#ddeclaration=ddeclaration)*
0083 -> document ;;
0084 
0085    enum_specifier=enum_specifier SEMICOLON
0086  | struct_or_union_specifier=struct_or_union_specifier SEMICOLON
0087  | TYPEDEF typedef_d=typedef_d SEMICOLON
0088  | try/rollback(external_block=external_block) catch(
0089       value_declaration=value_declaration
0090     )
0091 -> ddeclaration ;;
0092 
0093    typed_identifier ( SEMICOLON
0094  | try/rollback(function_definition=function_definition) catch(
0095       function_declaration=function_declaration
0096    ))
0097 -> value_declaration ;;
0098 
0099    EXTERN STRING_LITERAL LBRACE (#ddeclaration=ddeclaration)* RBRACE
0100 -> external_block ;;
0101 
0102 --   VOID
0103 -- | CHAR
0104 -- | SHORT
0105 -- | INT
0106 -- | LONG
0107 -- | FLOAT
0108 -- | DOUBLE
0109 ---> type_name_d ;;
0110 
0111    LPAREN type_attribute_identifier=type_attribute_identifier RPAREN (LPAREN (0 | (#function_pointer_parameter=function_pointer_parameter @ COMMA)) RPAREN | 0)
0112  | STAR type_attribute_identifier=type_attribute_identifier
0113  | type_attribute_identifier=type_attribute_identifier LBRACKET (0 | X_CONSTANT) RBRACKET
0114  | IDENTIFIER
0115 -> type_attribute_identifier ;;
0116 
0117    type_name=type_name type_attribute_identifier=type_attribute_identifier
0118 -> typed_identifier ;;
0119 
0120    typed_identifier=typed_identifier SEMICOLON
0121 -> variable_declaration ;;
0122 
0123    try/rollback(typed_identifier=typed_identifier) catch(
0124       type_name=type_name
0125    )
0126 -> parameter ;;
0127 
0128    struct_or_union_specifier=struct_or_union_specifier
0129  | enum_specifier=enum_specifier
0130  | typed_identifier=typed_identifier
0131 -> typedef_d ;;
0132 
0133    (#statement = statement)*
0134 -> execution_block ;;
0135 
0136    LPAREN (0|#declaration_parameter=declaration_parameter @ COMMA) RPAREN (0|asm_against_mangling=asm_against_mangling) SEMICOLON
0137 -> function_declaration ;;
0138 
0139    typed_identifier=typed_identifier (0 | EQUAL constant_expression=constant_expression)
0140  | ELLIPSIS
0141 -> named_parameter ;;
0142 
0143    try/rollback(typed_identifier=typed_identifier (0 | EQUAL constant_expression=constant_expression)) catch(
0144       type_name=type_name
0145    )
0146  | ELLIPSIS
0147 -> declaration_parameter ;;
0148 
0149    try/rollback(typed_identifier=typed_identifier) catch(
0150        type_name=type_name
0151    )
0152  | ELLIPSIS
0153 -> function_pointer_parameter ;;
0154 
0155    LPAREN (#named_parameter=named_parameter @ COMMA) RPAREN LBRACE execution_block=execution_block RBRACE
0156 -> function_definition ;;
0157 
0158 --   (#external_declaration=external_declaration)*
0159 ---> translation_unit ;;
0160 
0161    #declaration_specifier=declaration_specifier (#declaration_specifier=declaration_specifier)*
0162 -> declaration_header ;;
0163 
0164 --   declaration_header=declaration_header variable_or_function=variable_or_function
0165 ---> external_declaration ;;
0166 
0167 --   declarator=declarator (COMMA #init_declarator=init_declarator @ COMMA SEMICOLON
0168 --               | SEMICOLON
0169 --               | ?[:is_fun_definition:] declaration* compound_statement
0170 --               | (#declaration=declaration)* compound_statement=compound_statement
0171 --               | initializer=initializer (COMMA #init_declarator=init_declarator)* SEMICOLON)
0172 ---> variable_or_function ;;
0173 
0174 ------------------------------------------------------------
0175 -- GCC-STUFF
0176 ------------------------------------------------------------
0177    STRING_LITERAL LPAREN IDENTIFIER
0178 -> asm_specifier ;;
0179 
0180    ASM (0 | VOLATILE) LPAREN (STRING_LITERAL*) (0 | COLON (#output_operands=asm_specifier @ COMMA) (0 | COLON (#input_operands=asm_specifier @ COMMA) (0 | COLON (STRING_LITERAL @ COMMA))))
0181 -> inline_asm ;;
0182 
0183    EXTENSION LPAREN LBRACE execution_block RBRACE RPAREN
0184 -> ext_expression ;;
0185 
0186    ASM LPAREN STRING_LITERAL RPAREN
0187 -> asm_against_mangling ;;
0188 
0189 ------------------------------------------------------------
0190 -- E X P R E S S I O N S
0191 ------------------------------------------------------------
0192 
0193    identifier=IDENTIFIER
0194  | constant=constant
0195  | string_literal=STRING_LITERAL
0196  | LPAREN expression=expression RPAREN
0197 -> primary_expression ;;
0198 
0199    primary_expression=primary_expression (#postfix_expression_rest=postfix_expression_rest)*
0200 -> postfix_expression ;;
0201 
0202    (DOT | ARROW) IDENTIFIER
0203  | PLUS_PLUS
0204  | MINUS_MINUS
0205  | LPAREN (argument_expression_list=argument_expression_list | 0) RPAREN
0206  | LBRACKET expression=expression RBRACKET
0207 -> postfix_expression_rest ;;
0208 
0209    #assignment_expression=assignment_expression @ COMMA
0210 -> argument_expression_list ;;
0211 
0212    postfix_expression=postfix_expression
0213  | PLUS_PLUS unary_expression=unary_expression
0214  | MINUS_MINUS unary_expression=unary_expression
0215  | unary_operator cast_expression=cast_expression
0216  | SIZEOF LPAREN type_name=type_name RPAREN
0217 -> unary_expression ;;
0218 
0219    AND
0220  | STAR
0221  | PLUS
0222  | MINUS
0223  | TILDE
0224  | NOT
0225 -> unary_operator ;;
0226 
0227    LPAREN type_name=type_name RPAREN cast_expression=cast_expression
0228  | unary_expression=unary_expression
0229 -> cast_expression ;;
0230 
0231    #cast_expression=cast_expression @ (STAR | DIVIDE | REMAINDER)
0232 -> multiplicative_expression ;;
0233 
0234    #multiplicative_expression=multiplicative_expression @ (PLUS | MINUS)
0235 -> additive_expression ;;
0236 
0237    #additive_expression=additive_expression @ (LSHIFT | RSHIFT)
0238 -> shift_expression ;;
0239 
0240    #shift_expression=shift_expression @ (LESS | GREATER | LESS_EQUAL | GREATER_EQUAL)
0241 -> relational_expression ;;
0242 
0243    #relational_expression=relational_expression @ (EQUAL_EQUAL | NOT_EQUAL)
0244 -> equality_expression ;;
0245 
0246    #equality_expression=equality_expression @ AND
0247 -> AND_expression ;;
0248 
0249    #AND_expression=AND_expression @ XOR
0250 -> exclusive_OR_expression ;;
0251 
0252    #exclusive_OR_expression=exclusive_OR_expression @ OR
0253 -> inclusive_OR_expression ;;
0254 
0255    #inclusive_OR_expression=inclusive_OR_expression @ AND_AND
0256 -> logical_AND_expression ;;
0257 
0258    #logical_AND_expression=logical_AND_expression @ OR_OR
0259 -> logical_OR_expression ;;
0260 
0261    logical_OR_expression=logical_OR_expression (QUESTION expression COLON conditional_expression | 0)
0262 -> conditional_expression ;;
0263 
0264    #conditional_expression=conditional_expression @ assignment_operator
0265 -> assignment_expression ;;
0266 
0267    EQUAL
0268  | STAR_EQUAL
0269  | DIVIDE_EQUAL
0270  | REMAINDER_EQUAL
0271  | PLUS_EQUAL
0272  | MINUS_EQUAL
0273  | LSHIFT_EQUAL
0274  | RSHIFT_EQUAL
0275  | AND_EQUAL
0276  | XOR_EQUAL
0277  | OR_EQUAL
0278 -> assignment_operator ;;
0279 
0280    #assignment_expression=assignment_expression @ COMMA
0281 -> expression ;;
0282 
0283    conditional_expression=conditional_expression
0284 -> constant_expression ;;
0285 
0286    X_CONSTANT
0287 -> constant ;;
0288 
0289 ------------------------------------------------------------
0290 -- S T A T E M E N T S
0291 ------------------------------------------------------------
0292    IDENTIFIER COLON
0293  | labeled_statement=labeled_statement
0294  | compound_statement=compound_statement
0295  | expression_statement=expression_statement
0296  | selection_statement=selection_statement
0297  | iteration_statement=iteration_statement
0298  | jump_statement=jump_statement
0299  | inline_asm
0300  | SEMICOLON
0301 -> statement ;;
0302 
0303    CASE constant_expression=constant_expression COLON statement=statement
0304  | DEFAULT COLON statement=statement
0305 -> labeled_statement ;;
0306 
0307    LBRACE (#declaration=declaration)* (#statement=statement)* RBRACE
0308 -> compound_statement ;;
0309 
0310    expression=expression SEMICOLON
0311 -> expression_statement ;;
0312 
0313    IF LPAREN expression=expression RPAREN statement=statement (ELSE alternative_statement=statement | 0)
0314  | SWITCH LPAREN expression=expression RPAREN statement=statement
0315 -> selection_statement ;;
0316 
0317    WHILE LPAREN (expression=expression | ext_expression=ext_expression) RPAREN statement=statement
0318  | DO statement WHILE LPAREN expression=expression RPAREN SEMICOLON
0319  | FOR LPAREN (for_1=expression|for1_ext=ext_expression|0) SEMICOLON (for_2=expression|for2_ext=ext_expression|0) SEMICOLON (for_3=expression|for3_ext=ext_expression|0) RPAREN statement=statement
0320 -> iteration_statement ;;
0321 
0322    GOTO IDENTIFIER SEMICOLON
0323  | CONTINUE SEMICOLON
0324  | BREAK SEMICOLON
0325  | RETURN (expression=expression | 0) SEMICOLON
0326 -> jump_statement ;;
0327 
0328 ------------------------------------------------------------
0329 -- D E C L A R A T I O N S
0330 ------------------------------------------------------------
0331 
0332    #declaration_specifier=declaration_specifier (#declaration_specifier=declaration_specifier)* (#init_declarator=init_declarator @ COMMA | 0) SEMICOLON
0333 -> declaration ;;
0334 
0335    storage_class_specifier=storage_class_specifier
0336  | type_specifier=type_specifier
0337  | type_qualifier=type_qualifier
0338 -> declaration_specifier ;;
0339 
0340    declarator=declarator (EQUAL initializer=initializer | 0)
0341 -> init_declarator ;;
0342 
0343    TYPEDEF
0344  | EXTERN
0345  | STATIC
0346  | AUTO
0347  | REGISTER
0348 -> storage_class_specifier ;;
0349 
0350    VOID
0351  | CHAR
0352  | SHORT
0353  | INT
0354  | LONG
0355  | FLOAT
0356  | DOUBLE
0357  | SIGNED
0358  | UNSIGNED
0359  | struct_or_union_specifier=struct_or_union_specifier
0360  | enum_specifier=enum_specifier
0361  | TYPEDEF_NAME
0362 -> type_specifier ;;
0363 
0364 --   EXTERN STRING_LITERAL LBRACE (#external_declaration=external_declaration)* RBRACE
0365 ---> external_block ;;
0366 
0367    (STRUCT | UNION) (IDENTIFIER LBRACE (#struct_declaration=struct_declaration)* RBRACE
0368                      | LBRACE (#struct_declaration=struct_declaration)* RBRACE)
0369 -> struct_or_union_specifier ;;
0370 
0371    #specifier_qualifier=specifier_qualifier #specifier_qualifier=specifier_qualifier (#specifier_qualifier=specifier_qualifier*) (#struct_declarator=struct_declarator)* SEMICOLON
0372 -> struct_declaration ;;
0373 
0374    type_specifier=type_specifier
0375  | type_qualifier=type_qualifier
0376 -> specifier_qualifier ;;
0377 
0378    declarator=declarator (constant_expression=constant_expression | 0)
0379  | COLON constant_expression=constant_expression
0380 -> struct_declarator ;;
0381 
0382    ENUM (IDENTIFIER LBRACE #enumerator=enumerator @ COMMA RBRACE | LBRACE #enumerator=enumerator @ COMMA RBRACE)
0383 -> enum_specifier ;;
0384 
0385    IDENTIFIER (EQUAL constant_expression=constant_expression | 0)
0386 -> enumerator ;;
0387 
0388    CONST
0389  | VOLATILE
0390 -> type_qualifier ;;
0391 
0392    (pointer=pointer direct_declarator=direct_declarator | direct_declarator=direct_declarator) (#direct_declarator_rest=direct_declarator_rest)*
0393  | direct_declarator=direct_declarator
0394 -> declarator ;;
0395 
0396    IDENTIFIER
0397  | LPAREN declarator=declarator RPAREN
0398 -> direct_declarator ;;
0399 
0400    LBRACKET (constant_expression | 0) RBRACKET
0401  | LPAREN (IDENTIFIER @ COMMA | parameter_type_list=parameter_type_list | 0) RPAREN
0402 -> direct_declarator_rest ;;
0403 
0404    STAR (#type_qualifier=type_qualifier | STAR)*
0405 -> pointer ;;
0406 
0407    (#parameter_declaration=parameter_declaration | ELLIPSIS) @ COMMA
0408  | 0
0409 -> parameter_type_list ;;
0410 
0411    #declaration_specifier=declaration_specifier (#declaration_specifier=declaration_specifier)* (declarator=declarator | abstract_declarator=abstract_declarator | 0)
0412 -> parameter_declaration ;;
0413 
0414    #specifier_qualifier=specifier_qualifier (#specifier_qualifier=specifier_qualifier)*
0415 -> type_name ;;
0416 
0417    (pointer=pointer #direct_abstract_declarator=direct_abstract_declarator | #direct_abstract_declarator=direct_abstract_declarator) (#direct_abstract_declarator=direct_abstract_declarator)*
0418 -> abstract_declarator ;;
0419 
0420    LPAREN (abstract_declarator=abstract_declarator | parameter_type_list=parameter_type_list) RPAREN
0421  | LBRACKET (constant_expression | 0) RBRACKET
0422 -> direct_abstract_declarator ;;
0423 
0424    assignment_expression=assignment_expression
0425  | LBRACE #initializer=initializer (COMMA (#initializer=initializer | 0))* RBRACE
0426 -> initializer ;;
0427 
0428 [:
0429 namespace cc
0430 {
0431 Parser::ParserState *Parser::copyCurrentState()
0432 {
0433   ParserState *state = new ParserState();
0434   state->ltCounter = m_state.ltCounter;
0435   return state;
0436 }
0437 
0438 void Parser::restoreState( Parser::ParserState *state )
0439 {
0440   m_state.ltCounter = state->ltCounter;
0441 }
0442 };
0443 :]