Mercurial > ~dholland > hg > ag > index.cgi
diff tests/agcl/parsifal/cpp.syn @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/agcl/parsifal/cpp.syn Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,1351 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + */ +{ +// class AstNode; + + #include "cppdefs.h" + #include "agstk.h" + #include <stdio.h> + #include "mpp.h" + + extern int columnNumber; + + #define INPUT_CODE(t) inputCode(t) + +#ifndef SYNTAX_ERROR +#define SYNTAX_ERROR printf("%s\n", (PCB).error_message) +#endif + + + parse_pcb_type *pcbPointer = 0; + #define PCB (*pcbPointer) + + extern char *inputName[]; + InputToken *trackPointer; + + int inputCode(const InputToken &t) { + int code = t.code; + if (code == IDENTIFIER) code = getTokenType(t.handle); + PCB.column = t.column; + if (PCB.pointer == trackPointer) return code; + trackPointer = PCB.pointer; + if (code == LINE) printf("[%02d] %s(%d): %d\n", scopeStack.size(), inputName[code], code, t.handle); + else printf("[%02d] %s(%d): %s\n", scopeStack.size(), inputName[code], code, td[t.handle]); + return code; + } + + AgStack<ParserState> stateStack; + + #include "cpp.h" +} +[ + pointer input + pointer type = InputToken * + default Input type = InputToken + //default token type = AstNode * + context type = ParserState + input values + ~declare PCB + ~lines and columns + parser name = parse + parser file name = "#.cpp" + line numbers + disregard line number + error trace + ~allow macros + sticky { + statement, // resolve if/else conflict + type specifier seq, // conflict between * as dereference and as multiply + ptr operator, // conflict between * as dereference and as multiply + class name, // qualifying :: on type and global :: on declarator + IDENTIFIER, // Resolves ctor/bitfield conflict + explicitly typed identifier, + nested name specifier, + NEW, + DELETE + } + enum { // See TOKEN.H + eof =0, + SPACE =' ', + AND ='A', // "&&" + ADD_EQ, // "+=" + AND_EQ, // "&=" + ARROW, // "->" + CONCAT, // "##" + DECR, // "--" + DIV_EQ, // "/=" + ELLIPSIS, // "..." + EQ, // "==" + GE, // ">=" + INCR, // "++" + LE, // "<=" + LS, // "<<" + LS_EQ, // "<<=" + MOD_EQ, // "%=" + MULT_EQ, // "*=" + NE, // "!=" + OR, // "||" + OR_EQ, // "|=" + RS, // ">>" + RS_EQ, // ">>=" + SUB_EQ, // "-=" + XOR_EQ, // "^=" + CHARACTERconstant, // character constant + STRINGliteral, // character string + DOT_STAR = 'a', + ARROW_STAR, + QUAL, + LINE, + IDENTIFIER = 129, + CLASS_NAME, + ENUM_NAME, + TYPEDEF_NAME, + TEMPLATE_NAME, + NAMESPACE_NAME, + NAMESPACE_ALIAS, + UNSIGNEDqualifier, + LONGqualifier, + FLOATqualifier, + HEXconstant, + OCTconstant, + DECconstant, + FLOATconstant, // real + AUTO, // "auto" + BREAK, // "break" + CASE, // "case" + CHAR, // "char" + CONSTANT, // "const" + CONTINUE, // "continue" + DEFAULT, // "default" + DO, // "do" + DOUBLE, // "double" + ELSE, // "else" + ENUM, // "enum" + EXTERN, // "extern" + FLOAT, // "float" + FOR, // "for" + GOTO, // "goto" + IF, // "if" + INT, // "int" + LONG, // "long" + REGISTER, // "register" + RETURN, // "return" + SHORT, // "short" + SIGNED, // "signed" + SIZEOF, // "sizeof" + STATIC, // "static" + STRUCT, // "struct" + SWITCH, // "switch" + TYPEDEF, // "typedef" + UNION, // "union" + UNSIGNED, // "unsigned" + VOID, // "void" + VOLATILE, // "volatile" + WHILE, // "while" + ASM, + BITAND, + BITOR, + BOOL, + CATCH, + CLASS, + COMPL, + CONST_CAST, + DELETE, + DYNAMIC_CAST, + EXPLICIT, + EXPORT, + FALSE, + FRIEND, + INLINE, + MUTABLE, + NAMESPACE, + NEW, + NOT, + NOT_EQ, + OPERATOR, + PRIVATE, + PROTECTED, + PUBLIC, + REINTERPRET_CAST, + STATIC_CAST, + TEMPLATE, + THIS, + THROW, + TRUE, + TRY, + TYPEID, + TYPENAME, + USING, + VIRTUAL, + WCHAR_T, + CDECL, + PASCAL, + RTLENTRY, + NEAR, + FAR, + UNRECOGNIZED + } +] + +(void) line number + -> LINE:x =PCB.line = x.handle; + -> CDECL + PASCAL +RTLENTRY + NEAR + FAR //hack to skip non ANSI stuff + +skip = LINE + CDECL + PASCAL + RTLENTRY + NEAR + FAR + +translation unit $ + -> declaration list, eof // 3.5 + +literal + -> HEXconstant + -> OCTconstant + -> DECconstant + -> FLOATconstant + -> CHARACTERconstant + -> STRINGliteral... //Concatenate adjacent strings + +(TypeDefinition) class name + -> CLASS_NAME:n =TypeDefinition(n); +// -> TYPEDEF_NAME + -> template id:n =TypeDefinition(n); + +// 5.1 +primary expression + -> literal + -> THIS + -> QUAL, IDENTIFIER + -> QUAL, operator function id + -> qualified id + -> '(', expression hack 1, ')' + -> unqualified id + +id expression + -> unqualified id + -> qualified id + +unqualified id + -> IDENTIFIER:n ={ + TypeDefinition d(n); + if (typedefFlag) { + d.tokenType = TYPEDEF_NAME; + typedefFlag = 0; + } + scopeStack.top()->addIdentifier(d); + } + -> operator function id + -> conversion function id + +(Scope *) qualified id + -> nested name specifier:s, QUAL, unqualified id =s; + -> nested name specifier:s, QUAL, TEMPLATE, unqualified id =s; + +(Scope *) nested name specifier + -> class name:n =n.scope; + -> namespace name:n =n.scope; + -> QUAL, class name:n = scopeStack[0]->getNestedScope(n.handle); + -> QUAL, namespace name:n = scopeStack[0]->getNestedScope(n.handle); + -> nested name specifier:s, QUAL, class name:n = (s == 0) ? 0 : s->getNestedScope(n.handle); + -> nested name specifier:s, QUAL, namespace name:n =(s == 0) ? 0 : s->getNestedScope(n.handle); + +//5.2 + +postfix expression + -> primary expression + -> postfix expression, '[', expression, ']' + -> postfix expression, '(', expression list?, ')' + -> simple type specifier, '(', expression list?, ')' + -> postfix expression, '.', id expression + -> postfix expression, '.', TEMPLATE, id expression + -> postfix expression, ARROW, id expression + -> postfix expression, ARROW, TEMPLATE, id expression + -> postfix expression, '.', pseudo destructor name + -> postfix expression, ARROW, pseudo destructor name + -> postfix expression, INCR + -> postfix expression, DECR + -> DYNAMIC_CAST, '<', type id, '>', '(', expression, ')' + -> STATIC_CAST, '<', type id, '>', '(', expression, ')' + -> REINTERPRET_CAST, '<', type id, '>', '(', expression, ')' + -> CONST_CAST, '<', type id, '>', '(', expression, ')' + -> TYPEID, '(', expression hack 1, ')' + -> TYPEID, '(', type id, ')' + +expression list + -> assignment expression + -> expression list, ',', assignment expression + +pseudo destructor name + -> nonclass type name, QUAL, '~', nonclass type name + -> nested name specifier, QUAL, nonclass type name, QUAL, '~', nonclass type name + -> QUAL, nonclass type name, QUAL, '~', nonclass type name + -> '~', nonclass type name + -> nested name specifier, QUAL, '~', nonclass type name + -> QUAL, '~', nonclass type name + +// 5.3 + +unary expression + -> postfix expression + -> INCR, cast expression + -> DECR, cast expression + -> unary operator, cast expression + -> SIZEOF, unary expression + -> SIZEOF, '(', type id, ')' + -> new expression + -> delete expression + +unary operator + -> '&' | '*' | '+' | '-' | '~' | '!' + +new expression + -> new, new type id, new initializer? + -> new, new placement, new type id, new initializer? + -> new, '(', type id, ')', new initializer? + -> new, new placement, '(', type id, ')', new initializer? + +new + -> NEW + -> QUAL, NEW + +new placement + -> '(', expression list hack 2, ')' + +expression list hack 2 + -> retry, expression list + -> retry, retry, resynch =diagnose("expression list hack 2"); + +new type id + -> type specifier seq + -> type specifier seq, new declarator + +new declarator + -> ptr operator + -> ptr operator, new declarator + -> direct new declarator + +direct new declarator + -> '[', expression, ']' + -> direct new declarator, '[', constant expression, ']' + +new initializer + -> '(', expression list?, ')' + +delete expression + -> delete, cast expression + -> delete, '[', ']', cast expression + +delete + -> DELETE + -> QUAL, DELETE + +cast expression + -> unary expression + -> '(', type id, ')', cast expression + +expression hack 1 + -> retry, expression + -> retry, error, resynch =diagnose("expression hack 1"); + +restricted assignment expression hack 5 + -> retry, restricted assignment expression + -> retry, error, resynch =diagnose("expression hack 1"); + +pm expression + -> cast expression + -> pm expression, DOT_STAR, cast expression + -> pm expression, ARROW_STAR, cast expression + +multiplicative expression + -> pm expression + -> multiplicative expression, '*', pm expression + -> multiplicative expression, '/', pm expression + -> multiplicative expression, '%', pm expression + +additive expression + -> multiplicative expression + -> additive expression, '+', multiplicative expression + -> additive expression, '-', multiplicative expression + +shift expression + -> additive expression + -> shift expression, LS, additive expression + -> shift expression, RS, additive expression + +relational expression + -> shift expression + -> relational expression, '<', shift expression + -> relational expression, '>', shift expression + -> relational expression, LE, shift expression + -> relational expression, GE, shift expression + +equality expression + -> relational expression + -> equality expression, EQ, relational expression + -> equality expression, NE, relational expression + +and expression + -> equality expression + -> and expression, '&', equality expression + +exclusive or expression + -> and expression + -> exclusive or expression, '^', and expression + +inclusive or expression + -> exclusive or expression + -> inclusive or expression, '|', exclusive or expression + +logical and expression + -> inclusive or expression + -> logical and expression, AND, inclusive or expression + +logical or expression + -> logical and expression + -> logical or expression, OR, logical and expression + +conditional expression + -> logical or expression + -> logical or expression, '?', expression, ':', conditional expression + +assignment expression + -> conditional expression + -> logical or expression, assignment operator, assignment expression + -> throw expression + +assignment operator + -> '=' | MULT_EQ | DIV_EQ | MOD_EQ | ADD_EQ | SUB_EQ + -> LS_EQ | RS_EQ | AND_EQ | OR_EQ | XOR_EQ + +expression + -> assignment expression + -> expression, ',', assignment expression + +constant expression + -> conditional expression + +statement + -> labeled statement + -> compound statement + -> selection statement + -> iteration statement + -> jump statement + -> try block + -> block declaration + -> variable declaration + -> function definition 2 + -> retry, statement try 2 + +statement try 2 + -> type qualifier?, declarator list, ';' + -> function definition 1 + -> retry, statement try 3 + +statement try 3 + -> expression statement + -> retry, resynch =diagnose("statement try 3"); + +labeled statement + -> IDENTIFIER, ':', statement + -> CASE, constant expression, ':', statement + -> DEFAULT, ':', statement + +expression statement + -> expression, ';' + +compound statement + -> begin block , statement seq?, '}' =restoreScope(); + +begin block + -> '{' =nestScope(); + +statement seq + -> statement + -> statement seq, statement + +selection statement + -> IF, '(', condition, ')', statement + -> IF, '(', condition, ')', statement, ELSE, statement + -> SWITCH, '(', condition, ')', statement + +condition + -> condition kernel + +condition kernel + -> type specifier seq, declarator, '=', assignment expression + -> retry, condition kernel 2 + +condition kernel 2 + -> expression + -> retry, resynch =diagnose("condition kernel 2"); + + +iteration statement + -> WHILE, '(', condition, ')', statement + -> DO, statement, WHILE, '(', condition, ')', ';' + -> for header, for init statement?, ';', condition?, ';', expression?, ')', statement =restoreScope(); + +for header + -> FOR, '(' =nestScope(); + +for init statement + -> for init + + +for init + -> for variable declaration + -> retry, for init 2 + +for variable declaration + -> decl specifier seq + -> decl specifier seq, init declarator list + +for init 2 + -> expression + -> retry, resynch =diagnose("for init 2"); + +jump statement + -> BREAK, ';' + -> CONTINUE, ';' + -> RETURN, expression?, ';' + -> GOTO, IDENTIFIER, ';' + +(int) declaration seq + -> =0; + -> declaration seq, declaration hack + +declaration list + -> declaration seq + +declaration hack + -> declaration =printf("declaration hack complete\n"); + +declaration + -> block declaration + -> simple declaration + //-> template declaration + -> explicit instantiation + -> explicit specialization + -> linkage specification + -> namespace definition + +block declaration + -> asm definition + -> namespace alias definition + -> using declaration + -> using directive + +(void) retry + -> error =CONTEXT.restore(); + +simple declaration + -> variable declaration =printf("variable declaration\n"); + -> template header, variable declaration =printf("variable declaration\n"), restoreScope(); + -> EXPORT, template header, variable declaration =printf("variable declaration\n"), restoreScope(); + -> function definition 2 =printf("function definition 2\n"); + -> template header, function definition 2 =printf("function definition 2\n"), restoreScope(); + -> EXPORT, template header, function definition 2 =printf("function definition 2\n"), restoreScope(); + -> retry, attempt declarator list + +attempt declarator list + -> type qualifier?, declarator list, ';' =printf("declarator list\n"); + -> template header, type qualifier?, declarator list, ';' =printf("declarator list\n"), restoreScope(); + -> function definition 1 =printf("function definition 1\n"); + -> retry, resynch =diagnose("attempt declarator list"); + +resynch + -> resynch text, ';' + -> resynch text, balanced braces + -> resynch text, eof =PCB.pointer--; + +resynch text +// -> resynch item + -> + -> resynch text, resynch item + +resynch item + -> ~(eof + skip + '(' + ')' + '[' + ']' + '{' + '}' + ';') + -> balanced parens + -> balanced brackets + +(void) balanced parens + -> '(', not right paren, ')' + +(void) balanced brackets + -> '[', not right bracket, ']' + +(void) balanced braces + -> '{', not right brace, '}' + +not right paren + -> + -> not right paren, resynch item + -> not right paren, ';' + ']' + '}' + -> not right paren, balanced braces + +not right bracket + -> + -> not right bracket, resynch item + -> not right bracket, ';' + ')' + '}' + -> not right bracket, balanced braces + +not right brace + -> + -> not right brace, resynch item + -> not right brace, ';' + ')' + ']' + -> not right brace, balanced braces + +variable declaration + -> decl specifier seq?, ';' + -> decl specifier seq, init declarator list, ';' + +/* + If there are no decl specifiers, then the declarator must be a constructor, + destructor, or type conversion operator. In this case, there can be no + initialization, so we use a declarator list instead of an init declarator list +*/ + +declarator list + -> declarator + -> declarator list, ',', declarator + + +decl specifier seq + -> fundamental type + -> fundamental type, predefined specifier... + -> type qualifier..., fundamental type, predefined specifier?... + -> user defined specifier, type qualifier?... + -> type qualifier..., user defined specifier, type qualifier?... + +restricted decl specifier seq + -> fundamental type + -> fundamental type, predefined specifier... + -> type qualifier..., fundamental type, predefined specifier?... + -> restricted specifier, type qualifier?... + -> type qualifier..., restricted specifier, type qualifier?... + +restricted specifier + -> qualified type name + +storage class specifier + -> AUTO + -> REGISTER + -> STATIC + -> EXTERN + -> MUTABLE + +function specifier + -> INLINE + -> VIRTUAL + -> EXPLICIT + +simple type specifier + -> qualified type name + -> fundamental type + + +predefined specifier + -> type qualifier + -> fundamental type + +type qualifier + -> storage class specifier + -> function specifier + -> FRIEND + -> TYPEDEF =typedefFlag = 1; + -> cv qualifier + +fundamental type + -> CHAR + -> WCHAR_T + -> BOOL + -> SHORT + -> INT + -> LONG + -> SIGNED + -> UNSIGNED + -> FLOAT + -> DOUBLE + -> VOID + +user defined specifier + -> class specifier + -> enum specifier + -> elaborated type specifier + -> qualified type name + +user type specifier + -> elaborated type specifier + -> qualified type name + +qualified type name + -> ENUM_NAME + -> TYPEDEF_NAME + -> nested name specifier + -> nested name specifier, QUAL, ENUM_NAME + -> nested name specifier, QUAL, TYPEDEF_NAME + +nonclass type name + -> ENUM_NAME + -> TYPEDEF_NAME + +elaborated type specifier + -> class key, IDENTIFIER:n ={ + TypeDefinition d(n); + if (templateFlag) { + d.tokenType = TEMPLATE_NAME; + scopeStack[scopeStack.size() - 2]->addIdentifier(d); + } + else { + d.tokenType = CLASS_NAME; + scopeStack.top()->addIdentifier(d); + } + } + -> class key, class name:d ={ + if (templateFlag) { + d.tokenType = TEMPLATE_NAME; + scopeStack[scopeStack.size() - 2]->addIdentifier(d); + } + else { + d.tokenType = CLASS_NAME; + scopeStack.top()->addIdentifier(d); + } + } + -> class key, name qualifier:scope, IDENTIFIER:n ={ + TypeDefinition d(n); + d.tokenType = templateFlag ? TEMPLATE_NAME : CLASS_NAME; + scope->addIdentifier(d); + } + -> class key, name qualifier:scope, class name:d ={ + d.tokenType = templateFlag ? TEMPLATE_NAME : CLASS_NAME; + scope->addIdentifier(d); + } + -> ENUM, IDENTIFIER + -> ENUM, name qualifier, IDENTIFIER + -> explicitly typed identifier + -> explicitly typed identifier, '<', template argument list, '>' + +explicitly typed identifier + -> TYPENAME, nested name specifier, QUAL, IDENTIFIER + +enum specifier + -> ENUM, '{', enumerator list?, '}' + -> ENUM, IDENTIFIER:n, '{', enumerator list?, '}' ={ + TypeDefinition d(n); + d.tokenType = ENUM_NAME; + scopeStack.top()->addIdentifier(d); + } + +enumerator list + -> enumerator definition + -> enumerator list, ',', enumerator definition + +enumerator definition + -> IDENTIFIER + -> IDENTIFIER, '=', constant expression + +(TypeDefinition) namespace name + -> NAMESPACE_NAME:n =TypeDefinition(n); + -> NAMESPACE_ALIAS:n =TypeDefinition(n); + +namespace definition + -> named namespace definition + -> unnamed namespace definition + +named namespace definition + -> original namespace definition + -> extension namespace definition + +original namespace definition + -> NAMESPACE, IDENTIFIER, '{', namespace body, '}' + +extension namespace definition + -> NAMESPACE, NAMESPACE_NAME, '{', namespace body, '}' + +unnamed namespace definition + -> NAMESPACE, '{', namespace body, '}' + +namespace body + -> declaration seq + +namespace alias definition + -> NAMESPACE, IDENTIFIER, '=', qualified namespace specifier, ';' + +qualified namespace specifier + -> name qualifier, namespace name + +using declaration + -> USING, nested name specifier, QUAL, unqualified id, ';' + -> USING, TYPENAME, nested name specifier, QUAL, unqualified id, ';' + -> USING, QUAL, unqualified id, ';' + +using directive + -> USING, NAMESPACE, namespace name, ';' + -> USING, NAMESPACE, name qualifier, namespace name, ';' + +(Scope *) name qualifier + -> QUAL =scopeStack[0]; + -> class name:n, QUAL =getNestedScope(n.handle); + -> namespace name:n, QUAL =getNestedScope(n.handle); + -> name qualifier:s, class name:n, QUAL =s->getNestedScope(n.handle); + -> name qualifier:s, namespace name:n, QUAL =(s == 0) ? 0 : s->getNestedScope(n.handle); + +asm definition + -> ASM, '(', STRINGliteral, ')', ';' + +linkage specification + -> EXTERN, STRINGliteral, '{', declaration list, '}' + -> EXTERN, STRINGliteral, declaration + +init declarator list + -> init declarator + -> init declarator list, ',', init declarator + +init declarator + -> direct declarator + -> direct declarator, initializer + -> ptr operator, init declarator + +(Scope *) declarator + -> direct declarator:s =s; + -> ptr operator, declarator:s =s; + +(Scope *) direct declarator + -> declarator id:s =s; + -> direct declarator:s, '(', parameter declaration clause hack 4, ')', cv qualifier seq?, exception specification? =s; + -> direct declarator:s, '[', constant expression?, ']' =s; + -> '(', declarator:s, ')' =s; + +declarator hack + -> direct declarator hack + -> ptr operator, declarator hack + +direct declarator hack + -> declarator id + -> direct declarator hack, '(', parameter declaration clause hack 4, ')', cv qualifier seq?, exception specification? + -> direct declarator hack, '[', constant expression?, ']' + -> '(', declarator hack 3, ')' + +ptr operator + -> '*', cv qualifier seq? + -> '&' + -> nested name specifier, QUAL, '*', cv qualifier seq? + +cv qualifier seq + -> cv qualifier, cv qualifier seq? + +cv qualifier + -> CONSTANT + -> VOLATILE + +(Scope *) declarator id + -> unqualified id =new Scope; + -> nested name specifier:s, QUAL, unqualified id =s; + -> nested name specifier:s, QUAL, CLASS_NAME =s; + -> nested name specifier:s, QUAL, '~', CLASS_NAME =s; + -> nested name specifier:s, QUAL, TEMPLATE_NAME =s; + -> nested name specifier:s, QUAL, '~', TEMPLATE_NAME =s; + -> CLASS_NAME:n ={ + TypeDefinition d(n); + if (typedefFlag) { + d.tokenType = TYPEDEF_NAME; + typedefFlag = 0; + scopeStack.top()->addIdentifier(d); + } + return new Scope; + } + -> TEMPLATE_NAME:n ={ + TypeDefinition d(n); + if (typedefFlag) { + d.tokenType = TYPEDEF_NAME; + typedefFlag = 0; + scopeStack.top()->addIdentifier(d); + } + return new Scope; + } + -> '~', CLASS_NAME:n =TypeDefinition(n).scope; // '~' is a unary operator + -> '~', TEMPLATE_NAME:n =TypeDefinition(n).scope; // '~' is a unary operator + +type id + -> type specifier seq, abstract declarator? + +type specifier seq + -> fundamental type + -> fundamental type, predefined specifier... + -> cv qualifier..., fundamental type + -> cv qualifier..., fundamental type, predefined specifier... + -> user type specifier, cv qualifier?... + -> cv qualifier..., user type specifier, cv qualifier?... + + +abstract declarator hack + -> ptr operator, abstract declarator hack? + -> direct abstract declarator hack + +direct abstract declarator hack + -> '(', ')', cv qualifier seq?, exception specification? + -> '(', parameter declaration clause hack 3, ')', cv qualifier seq?, exception specification? + -> '[', constant expression?, ']' + -> '(', /* hack 3 */ abstract declarator, ')' + -> direct abstract declarator hack, '(', parameter declaration clause?, ')', cv qualifier seq?, exception specification? + -> direct abstract declarator hack, '[', constant expression?, ']' + +abstract declarator + -> ptr operator, abstract declarator? + -> direct abstract declarator + +direct abstract declarator + -> '(', ')', cv qualifier seq?, exception specification? + -> '(', parameter declaration clause, ')', cv qualifier seq?, exception specification? + -> '[', constant expression?, ']' + -> '(', abstract declarator, ')' + -> direct abstract declarator, '(', parameter declaration clause?, ')', cv qualifier seq?, exception specification? + -> direct abstract declarator, '[', constant expression?, ']' + +parameter declaration clause + -> parameter declaration list + -> ELLIPSIS + -> parameter declaration list, ELLIPSIS + -> parameter declaration list, ',', ELLIPSIS + +parameter declaration list + -> parameter declaration + -> parameter declaration list, ',', parameter declaration + +parameter declaration + -> decl specifier seq, declarator hack + -> decl specifier seq, declarator hack, '=', assignment expression + -> decl specifier seq, abstract declarator hack? + -> decl specifier seq, abstract declarator hack?, '=', assignment expression + +parameter declaration clause hack 3 + -> parameter declaration clause + +declarator hack 3 + -> retry, declarator + -> retry, error, ~eof, resynch =diagnose("declarator hack 3"); + +parameter declaration clause hack 4 + -> parameter declaration clause? + +expression list hack 4 + -> retry, expression list + -> retry, error, ~(eof + skip + ')')?... =diagnose("expression list hack 4"); + +function definition 1 + -> constructor identifier, ctor initializer?, function body ={if (templateFlag) restoreScope();} + -> constructor identifier, constructor try block ={if (templateFlag) restoreScope();} + +constructor try block + -> TRY, ctor initializer?, function body, handler seq + +constructor identifier + -> type qualifier?, declarator:s =nestScope(s); + -> template header, type qualifier?, declarator:s =nestScope(s); + -> EXPORT, template header, type qualifier?, declarator:s =nestScope(s); + +function definition 2 + -> function identifier, function body + -> function identifier, function try block + +function identifier + -> decl specifier seq, declarator:s =nestScope(s); + +function body + -> '{', statement seq?, '}' =restoreScope(); + +function try block + -> TRY, function body, handler seq + + +initializer + -> '=', initializer clause + -> '(', expression list hack 4, ')' + +initializer clause + -> assignment expression + -> '{', initializer list, ','?, '}' + -> '{', '}' + +initializer list + -> initializer clause + -> initializer list, ',', initializer clause + +class specifier + -> class head, '{', member specification?, '}' =restoreScope(); + -> class head, ':', base clause, '{', member specification?, '}' =restoreScope(); + +specifier lookahead + -> '{'+ ':' =CONTEXT.restore(); + +class head + -> class key, specifier lookahead ={ + nestScope(); + } + -> class key, IDENTIFIER:n, specifier lookahead ={ + TypeDefinition d(n); + int flag = templateFlag; + d.scope = nestScope(d.handle); + if (flag) { + d.tokenType = TEMPLATE_NAME; + scopeStack[scopeStack.size() - 3]->addIdentifier(d); + } + else { + d.tokenType = CLASS_NAME; + scopeStack[scopeStack.size() - 2]->addIdentifier(d); + } + } + -> class key, class name:d, specifier lookahead ={ + d.tokenType = templateFlag? TEMPLATE_NAME : CLASS_NAME; + int flag = templateFlag; + d.scope = nestScope(d.handle); + if (flag) scopeStack[scopeStack.size() - 3]->addIdentifier(d); + else scopeStack[scopeStack.size() - 2]->addIdentifier(d); + } + -> class key, TEMPLATE_NAME:n, specifier lookahead ={ + TypeDefinition d(n); + d.tokenType = templateFlag? TEMPLATE_NAME : CLASS_NAME; + int flag = templateFlag; + d.scope = nestScope(d.handle); + if (flag) scopeStack[scopeStack.size() - 3]->addIdentifier(d); + else scopeStack[scopeStack.size() - 2]->addIdentifier(d); + } + -> class key, name qualifier:s, IDENTIFIER:n, specifier lookahead ={ + if (s != 0) s->nest(new Scope(n.handle)); + } + -> class key, name qualifier:s, TEMPLATE, template id:h, specifier lookahead ={ + if (s != 0) s->nest(new Scope(h.handle)); + } + +class key + -> CLASS + -> STRUCT + -> UNION + +member specification + -> member declaration hack + -> member specification, member declaration hack + + +member declaration hack + -> member declaration + -> member restore, type qualifier?, member declarator list, ';' + -> member restore, function definition 1 + -> member restore, error, resynch =diagnose("member specification"); + +member restore + -> retry =printf("try member declarator list\n"); + +member declaration + -> ';' + -> decl specifier seq, member declarator list?, ';' + -> function definition 2 + -> using declaration +// -> template declaration + -> access specifier, ':' + +member declarator list + -> member declarator + -> member declarator list, ',', member declarator + +member declarator + -> declarator + -> declarator, pure specifier + -> declarator, constant intializer + -> ':', constant expression + -> IDENTIFIER, ':', constant expression + +pure specifier + -> '=', '0' + +constant intializer + -> '=', constant expression + +base clause + -> base specifier list + +base specifier list + -> base specifier:s =scopeStack.top()->addBase(s); + -> base specifier list, ',', base specifier:s =scopeStack.top()->addBase(s); + +(Scope *) base specifier + -> CLASS_NAME:n =getNestedScope(n.handle); + -> TEMPLATE_NAME:n =getNestedScope(n.handle); + -> qualified class name:s =s; + -> VIRTUAL, access specifier?, qualified class name:s =s; + -> access specifier, VIRTUAL?, qualified class name:s =s; + -> access specifier, VIRTUAL?, CLASS_NAME:n =getNestedScope(n.handle); + -> access specifier, VIRTUAL?, TEMPLATE_NAME:n =getNestedScope(n.handle); + +(Scope *) qualified class name + -> name qualifier:s, class name:n =(s == 0) ? 0 : s->getNestedScope(n.handle); + +access specifier + -> PRIVATE + -> PROTECTED + -> PUBLIC + +conversion function id + -> OPERATOR, conversion type id + +conversion type id + -> type specifier seq, conversion declarator? + +conversion declarator + -> ptr operator, conversion declarator? + +ctor initializer + -> ':', mem initializer list + +mem initializer list + -> mem initializer + -> mem initializer list, ',', mem initializer + +mem initializer + -> mem initializer id, '(', expression list?, ')' + +mem initializer id + -> qualified class name + -> class name + -> IDENTIFIER + +operator function id + -> OPERATOR, operator + +operator + -> NEW + -> DELETE + -> NEW, '[', ']' + -> DELETE, '[', ']' + -> '+' // =PLUS_OP; + -> '-' // =MINUS_OP; + -> '*' // =MUL_OP; + -> '/' // =DIV_OP; + -> '%' // =MOD_OP; + -> '^' // =XOR_OP; + -> '&' // =AND_OP; + -> '|' // =OR_OP; + -> '~' // =COM_OP; + -> '!' // =NOT_OP; + -> '=' // =ASSIGN_OP; + -> '<' // =LT_OP; + -> '>' // =GT_OP; + -> MULT_EQ + -> DIV_EQ + -> MOD_EQ + -> ADD_EQ + -> SUB_EQ + -> LS_EQ + -> RS_EQ + -> AND_EQ + -> OR_EQ + -> XOR_EQ + -> LS + -> RS + -> EQ + -> NE + -> LE + -> GE + -> AND + -> OR + -> INCR + -> DECR + -> ',' + -> ARROW_STAR + -> ARROW + -> '(', ')' // =PAREN_OP; + -> '[', ']' // =BRACKET_OP; + +/* +template declaration + -> template header, declaration =restoreScope(); + -> EXPORT, template header, declaration =restoreScope(); +*/ + +template header + -> TEMPLATE, '<', !nestScope();, template parameter list, '>' =templateFlag = 1; + +template parameter list + -> template parameter + -> template parameter list, ',', template parameter + +template parameter + -> type parameter + -> template parameter declaration + +template parameter declaration + -> restricted decl specifier seq, declarator hack + -> restricted decl specifier seq, declarator hack, '=', restricted assignment expression + -> restricted decl specifier seq, abstract declarator hack? + -> restricted decl specifier seq, abstract declarator hack?, '=', restricted assignment expression + +restricted assignment expression + -> restricted conditional expression + -> shift expression, assignment operator, restricted assignment expression + -> restricted throw expression + +restricted conditional expression + -> shift expression + -> shift expression, '?', shift expression, ':', restricted conditional expression + +restricted throw expression + -> THROW, restricted assignment expression? + +type parameter + -> CLASS + -> CLASS, IDENTIFIER:n =scopeStack.top()->addIdentifier(TypeDefinition(n.handle, CLASS_NAME)); + -> CLASS, '=', type id + -> CLASS, IDENTIFIER, '=', type id + -> TYPENAME, IDENTIFIER? + -> TYPENAME, IDENTIFIER?, '=', type id + -> TEMPLATE, '<', template parameter list, '>', CLASS, IDENTIFIER? + -> TEMPLATE, '<', template parameter list, '>', CLASS, IDENTIFIER?, '=', TEMPLATE_NAME + +(InputToken) template id + -> TEMPLATE_NAME:n, '<', template argument list, '>' =n; + +template argument list + -> template argument + -> template argument list, ',', template argument + +template argument + -> restricted assignment expression hack 5 + -> TEMPLATE_NAME + -> type id + +explicit instantiation + -> TEMPLATE, declaration + +explicit specialization + -> TEMPLATE, '<', '>', declaration + +try block + -> TRY, compound statement, handler seq + +handler seq + -> handler + -> handler seq, handler + +handler + -> CATCH, '(', exception declaration, ')', compound statement + +exception declaration + -> type specifier seq, declarator hack + -> type specifier seq, abstract declarator hack + -> type specifier seq + -> ELLIPSIS + +throw expression + -> THROW, assignment expression? + +exception specification + -> THROW, '(', type id list?, ')' + +type id list + -> type id + -> type id list, ',', type id + +{ + +#include "mpp.h" +#include "token.h" + +#define GET_CONTEXT CONTEXT = ParserState() + +int typedefFlag = 0; +AgStack<int> typedefStack; +int templateFlag = 0; +AgStack<int> templateStack; + +AgStack<InputToken> tokenStack; + +ParserState::ParserState() + : pointer(pcbPointer ? pcbPointer->pointer : 0), + line(pcbPointer ? pcbPointer->line : 0), + scopeStackDepth(scopeStack.size()), + typedefStackDepth(typedefStack.size()), + nLocalVariables(scopeStackDepth ? scopeStack.top()->nLocals(): 0), + templateStackDepth(templateStack.size()), + typedefFlag(::typedefFlag), + templateFlag(::templateFlag) +{ } + +void ParserState::restore() { + PCB.pointer = pointer; + PCB.line = line; + while (scopeStack.size() > scopeStackDepth) scopeStack.pop(); + while (typedefStack.size() > typedefStackDepth) typedefStack.pop(); + while (templateStack.size() > templateStackDepth) templateStack.pop(); + scopeStack.top()->restoreLocals(nLocalVariables); + ::typedefFlag = typedefFlag; + ::templateFlag = templateFlag; +} +void diagnose(char *msg) { + printf("Error: %s\n", msg); + PCB.exit_flag = AG_SEMANTIC_ERROR_CODE; +} + +c_parser::c_parser() { + pcbPointer = &pcb; + //init_parse(); // init parse +} + + +// Destructor + +c_parser::~c_parser() { +} + + +// Reset Parser + +c_parser &reset(c_parser &c) { + return c; +} + + +// Transmit token to c_parser + +/* + The overloaded operator "<<" is used to transmit data to a parser. + Newline tokens are filtered out, since they are passed along by the + token scanner only in case text output of the preprocessor is + required. + + If the parser has encountered an error, there is no point in giving + it any further input. + + Otherwise, the input_code and input_value fields of the pcb are set + up and cc() is called to deal with the token. +*/ + +token_sink &c_parser::operator << (InputToken c) { + printf("%d\n", c.code); + if (c.code == 10) return *this; + tokenStack.push(c); + if (c.code == END_OF_FILE) { + int k = tokenStack.size(); + int n = k; + InputToken *tokenArray = new InputToken[k]; + while (k--) { + tokenStack.pop(tokenArray[k]); + } + PCB.pointer = tokenArray; + trackPointer = tokenArray - 1; + PCB.line = 1; + scopeStack.push(new Scope); // global scope + parse(); + } + return *this; +} + +token_sink &c_parser::operator << (InputToken *s) { + while (s->code != END_OF_FILE) { + if ((int) s->code == 10) continue; + tokenStack.push(*s++); + } + return *this; +} + +}