This is gram.c in view mode; [Download] [Up]
extern char *malloc(), *realloc(); # line 2 "../../../../../src/compiler/parser/gram.y" #include "co_parse.h" #define SyntaxError _p_co_syntax_error static int in_quoted_block = 0; static int block_depth = 0; static int block_start_line[200]; # define ID 257 # define IN 258 # define DOTS 259 # define COLONCOLON 260 # define FLOATINGconstant 261 # define INTEGERconstant 262 # define CHARACTERconstant 263 # define OCTALconstant 264 # define HEXconstant 265 # define STRING 266 # define IMPLY 267 # define MATCH 268 # define LEQ 269 # define GEQ 270 # define EQ 271 # define NEQ 272 # define DEFAULT 273 # define COLONEQ 274 # define OVER 275 # define BARBAR 276 # define HIGHPREC 277 # define LOWPREC 278 # define UNARY 279 #define yyclearin yychar = -1 #define yyerrok yyerrflag = 0 extern int yychar; extern int yyerrflag; #ifndef YYMAXDEPTH #define YYMAXDEPTH 150 #endif #ifndef YYSTYPE #define YYSTYPE int #endif YYSTYPE yylval, yyval; # define YYERRCODE 256 # line 1168 "../../../../../src/compiler/parser/gram.y" int yyerror(s) char *s; { SyntaxError(s); } int yyexca[] ={ -1, 0, 0, 3, -2, 6, -1, 1, 0, -1, -2, 0, -1, 18, 41, 13, 44, 13, -2, 14, -1, 43, 40, 91, 58, 91, -2, 146, -1, 58, 59, 22, 41, 22, 44, 22, -2, 15, -1, 80, 40, 94, 58, 94, -2, 146, -1, 103, 40, 91, 58, 91, -2, 146, -1, 106, 44, 38, 125, 38, -2, 0, -1, 120, 40, 92, 58, 92, -2, 90, -1, 124, 40, 91, 58, 91, -2, 87, -1, 132, 257, 14, 258, 14, 275, 14, 40, 91, 58, 91, -2, 146, -1, 140, 40, 94, 58, 94, -2, 146, -1, 179, 59, 42, 44, 42, 125, 42, 94, 42, -2, 142, -1, 180, 256, 100, -2, 43, -1, 194, 267, 56, 44, 56, -2, 125, }; # define YYNPROD 148 # define YYLAST 647 int yyact[]={ 44, 144, 171, 145, 31, 79, 7, 8, 217, 40, 97, 243, 169, 100, 139, 138, 212, 191, 210, 44, 83, 187, 57, 31, 9, 155, 143, 200, 40, 231, 197, 175, 110, 112, 44, 78, 158, 159, 31, 102, 153, 204, 28, 40, 198, 168, 65, 97, 98, 120, 100, 63, 61, 82, 62, 36, 64, 44, 39, 199, 46, 31, 19, 111, 39, 203, 40, 99, 198, 44, 198, 79, 44, 46, 36, 87, 31, 39, 42, 46, 83, 40, 223, 199, 222, 199, 209, 37, 44, 36, 17, 69, 39, 44, 46, 59, 55, 31, 60, 56, 107, 208, 40, 117, 14, 160, 37, 117, 74, 44, 46, 27, 36, 31, 113, 39, 119, 46, 40, 5, 16, 37, 109, 117, 127, 220, 65, 36, 218, 46, 39, 63, 46, 129, 213, 112, 64, 107, 135, 136, 14, 14, 12, 71, 37, 144, 142, 145, 46, 215, 133, 196, 128, 46, 173, 144, 107, 145, 75, 37, 65, 48, 122, 46, 41, 63, 61, 116, 62, 46, 64, 178, 96, 34, 32, 131, 179, 85, 95, 30, 195, 73, 29, 46, 70, 94, 65, 176, 176, 151, 66, 63, 61, 26, 62, 25, 64, 24, 65, 22, 20, 205, 193, 63, 61, 50, 62, 189, 64, 150, 146, 147, 148, 149, 152, 170, 234, 216, 176, 219, 188, 7, 8, 154, 242, 47, 51, 52, 53, 54, 35, 211, 224, 156, 7, 8, 238, 190, 233, 9, 7, 8, 174, 186, 47, 51, 52, 53, 54, 35, 7, 8, 9, 157, 167, 7, 8, 235, 9, 47, 51, 52, 53, 54, 35, 193, 236, 193, 9, 241, 106, 7, 8, 9, 7, 8, 119, 86, 7, 8, 172, 228, 47, 51, 52, 53, 54, 35, 126, 9, 7, 8, 9, 7, 8, 125, 9, 47, 51, 52, 53, 54, 35, 221, 84, 76, 15, 4, 9, 7, 8, 9, 3, 2, 7, 8, 1, 13, 47, 51, 52, 53, 54, 0, 7, 8, 0, 9, 7, 8, 7, 8, 9, 0, 47, 51, 52, 53, 54, 0, 0, 0, 9, 0, 7, 8, 9, 244, 9, 51, 52, 53, 54, 150, 146, 147, 148, 149, 0, 141, 68, 0, 9, 150, 146, 147, 148, 149, 43, 6, 45, 0, 0, 10, 11, 38, 0, 23, 0, 65, 0, 18, 214, 108, 63, 61, 58, 62, 0, 64, 0, 0, 49, 0, 0, 192, 0, 38, 38, 0, 0, 0, 0, 0, 33, 0, 65, 0, 0, 67, 21, 63, 61, 80, 62, 81, 64, 0, 77, 0, 164, 38, 0, 0, 0, 18, 0, 38, 0, 0, 0, 0, 72, 72, 0, 103, 114, 105, 0, 89, 90, 91, 92, 93, 115, 0, 0, 0, 0, 0, 0, 121, 124, 132, 0, 105, 88, 118, 0, 104, 0, 0, 0, 0, 0, 134, 115, 164, 137, 140, 161, 101, 38, 38, 0, 103, 123, 105, 115, 0, 0, 0, 0, 0, 0, 165, 166, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 58, 0, 38, 38, 38, 0, 0, 162, 163, 105, 105, 101, 0, 0, 38, 0, 0, 0, 0, 180, 0, 115, 0, 103, 194, 105, 0, 0, 202, 184, 0, 0, 38, 0, 0, 0, 0, 181, 182, 183, 105, 0, 0, 177, 177, 185, 0, 104, 206, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 103, 207, 105, 0, 0, 38, 38, 0, 177, 0, 0, 38, 225, 38, 38, 0, 230, 0, 0, 0, 0, 194, 105, 194, 104, 0, 232, 0, 0, 0, 0, 0, 0, 0, 240, 0, 101, 0, 38, 0, 226, 227, 0, 0, 103, 0, 105, 0, 0, 239, 0, 0, 229, 0, 245, 0, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 101 }; int yypact[]={ 74, -1000, -1000, -1000, -251, -251, -1000, -1000, -1000, -1000, 102, 101, -251, -1000, 21, 55, -1000, -251, -1000, -1000, 54, -1000, -1000, 369, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 73, -1000, -1000, -1000, -1000, -2, -17, 100, -1000, 73, -1000, -1000, -20, -251, -1000, 17, -1000, -1000, 16, -1000, -1000, -1000, -1000, -1000, -1000, -251, -1000, -16, -1000, 36, 73, 73, 73, 73, 73, 14, 342, 64, -1000, -61, 91, -1000, -11, -1000, 71, -1000, -1000, -1000, 73, -20, -47, -251, 87, 33, -1000, -1000, 57, -1000, 89, 89, -1000, -1000, -1000, -1000, -30, -30, 67, -252, -253, -251, 85, -1000, -86, -44, -1000, -23, -1000, -1000, 71, -1000, 36, 36, -1000, 101, -1000, 17, -251, 161, -1000, -1000, -51, -1000, -1000, -1000, -1000, -1000, -1000, -255, -1000, -59, -251, -20, -1000, 149, -1000, -1000, -1000, 52, 52, -20, 36, 36, 36, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 73, 67, -36, 14, 26, -98, -1000, -1000, 67, -1000, 101, -28, -1000, -1000, -55, -1000, -1000, -1000, 52, 73, 36, 42, -1000, -1000, -1000, -1000, -43, -1000, -1000, 369, -240, -1000, 90, 123, -1000, 24, -1000, -259, 84, -1000, -1000, 95, -1000, -1000, 0, -1000, 14, -1000, -1000, -1000, 22, 20, -1000, -1000, -1000, 369, -1000, -1000, -251, 36, 36, -1000, -7, 73, -1000, -36, 33, 36, 36, -1000, -1000, -1000, -1000, -1000, -16, -1000, -1000, -1000, 95, -20, -251, 9, -1000, -1000, -1000, -1000, -50, -1000, -1000, -20, 14, 73, 36, -1000, 369, -1000 }; int yypgo[]={ 0, 316, 313, 312, 368, 305, 307, 306, 304, 295, 120, 90, 22, 288, 280, 277, 377, 39, 270, 243, 223, 25, 392, 105, 30, 370, 48, 31, 67, 35, 404, 395, 26, 21, 220, 216, 207, 17, 205, 78, 360, 200, 199, 197, 195, 193, 111, 42, 190, 185, 184, 143, 182, 179, 174, 173, 164, 161 }; int yyr1[]={ 0, 1, 1, 1, 3, 2, 6, 6, 6, 7, 7, 7, 10, 10, 11, 11, 13, 8, 8, 12, 14, 14, 15, 15, 15, 17, 17, 17, 17, 18, 20, 20, 20, 20, 21, 21, 24, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 27, 27, 27, 27, 28, 28, 26, 33, 33, 35, 35, 35, 35, 9, 9, 9, 9, 9, 19, 19, 34, 34, 36, 36, 37, 37, 32, 32, 32, 32, 32, 32, 32, 25, 25, 38, 38, 38, 22, 22, 22, 40, 40, 40, 40, 5, 5, 41, 41, 31, 31, 42, 42, 42, 42, 48, 42, 49, 49, 46, 47, 44, 44, 44, 50, 45, 45, 51, 51, 16, 16, 16, 16, 16, 16, 55, 52, 52, 52, 52, 52, 53, 54, 54, 56, 43, 39, 57, 57, 57, 57, 30, 30, 4, 4, 4, 29, 29 }; int yyr2[]={ 0, 3, 3, 1, 7, 15, 1, 3, 5, 1, 3, 7, 5, 3, 3, 5, 7, 1, 5, 5, 3, 7, 1, 5, 7, 9, 9, 7, 7, 3, 3, 3, 7, 7, 3, 7, 2, 2, 1, 5, 7, 7, 7, 7, 7, 9, 2, 2, 15, 7, 0, 2, 6, 6, 6, 10, 2, 1, 7, 2, 3, 7, 7, 2, 7, 3, 7, 7, 3, 7, 3, 3, 3, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 7, 7, 7, 9, 5, 7, 2, 7, 9, 5, 5, 7, 3, 7, 2, 2, 2, 2, 2, 2, 1, 7, 5, 5, 7, 2, 5, 7, 11, 3, 7, 5, 3, 7, 2, 2, 7, 2, 2, 2, 3, 7, 7, 7, 7, 7, 5, 2, 2, 3, 3, 3, 2, 2, 2, 2, 5, 7, 3, 3, 3, 1, 7 }; int yychk[]={ -1000, -1, -2, -3, -6, 45, -4, 257, 258, 275, -4, -4, 40, -5, 40, -7, -10, -11, -4, 41, -41, -31, -42, -16, -43, -44, -45, -46, -47, -52, -53, 40, -54, -30, -55, 266, 91, 123, -40, 94, 45, -56, -39, -4, 36, -25, 96, 261, -57, -22, -38, 262, 263, 264, 265, 41, 44, -12, -4, 41, 44, 43, 45, 42, 47, 37, -48, -16, -40, 93, -50, -51, -31, -51, 125, 58, -5, -16, -29, 91, -4, -4, 36, 64, -8, -10, -15, 91, -31, -16, -16, -16, -16, -16, -49, -46, -23, 33, -26, -28, 36, -30, -17, -4, -22, -25, -18, 123, 41, 58, 93, 124, 44, 125, -40, -4, 96, 36, -16, -29, 96, -4, -39, -22, -4, -9, -13, -17, -28, -26, -30, -11, -4, 93, -16, -47, -47, -25, 267, 267, -4, 274, 61, -32, 60, 62, 269, 270, 271, 272, 268, 275, 258, 63, -20, -21, 256, 276, 59, 60, -23, -40, -31, -31, -5, -4, -4, 93, 96, 267, 274, 61, -14, -12, 93, -27, -26, -30, -27, -29, -16, -31, -31, -31, -16, -22, -19, -33, -34, -36, 273, -37, -31, -26, -25, -21, 125, -24, 44, 59, 125, -22, -4, 93, 96, -27, -16, -31, 59, 44, 61, 274, 256, 44, 259, 125, -24, 267, 44, -32, 125, -23, 62, 62, -12, -4, -31, -31, -28, -30, -4, 36, -16, -33, -35, -17, -26, -30, -37, -31, -4, 260, 274, 61, -23, -16, -31 }; int yydef[]={ -2, -2, 1, 2, 0, 0, 7, 143, 144, 145, 8, 0, 9, 4, 0, 0, 10, 0, -2, 95, 0, 97, 99, 100, 101, 102, 103, 104, 105, 119, 120, 0, 122, 123, 124, 135, 0, 0, 0, 110, 0, 132, 133, -2, 0, 125, 0, 134, 136, 83, 84, 137, 138, 139, 140, 17, 0, 12, -2, 96, 0, 0, 0, 0, 0, 0, 38, 0, 0, 111, 0, 114, 117, 0, 116, 0, 89, 131, 141, 0, -2, 0, 0, 0, 0, 11, 19, 0, 98, 126, 127, 128, 129, 130, 106, 0, 0, 0, 46, 0, 0, 0, 47, -2, 83, 56, -2, 29, 121, 0, 112, 0, 0, 115, 109, 91, 0, 0, 0, 142, -2, 0, 85, 86, -2, 5, 18, 63, 0, 65, 0, 0, -2, 23, 0, 107, 108, 39, 50, 50, -2, 0, 0, 0, 76, 77, 78, 79, 80, 81, 82, 0, 0, 57, 38, 0, 0, 30, 31, 0, 34, 0, 0, 118, 88, 0, 94, 147, 93, 50, 0, 0, 0, 20, 24, 40, 51, 0, 41, -2, -2, 0, 44, 54, 0, 49, 0, 68, 0, 70, 71, 72, 0, 75, -2, 0, 27, 38, 36, 37, 28, 0, 91, 113, 92, 64, 66, 67, 16, 0, 0, 0, 45, 0, 0, 25, 57, 0, 0, 0, 26, 35, 32, 33, 21, 22, 52, 53, 55, 0, 146, 0, 0, 69, 58, 59, 60, 0, 73, 74, 146, 38, 0, 0, 48, 61, 62 }; typedef struct { char *t_name; int t_val; } yytoktype; #ifndef YYDEBUG # define YYDEBUG 0 /* don't allow debugging */ #endif #if YYDEBUG yytoktype yytoks[] = { "ID", 257, "IN", 258, "DOTS", 259, "COLONCOLON", 260, "FLOATINGconstant", 261, "INTEGERconstant", 262, "CHARACTERconstant", 263, "OCTALconstant", 264, "HEXconstant", 265, "STRING", 266, "IMPLY", 267, "MATCH", 268, "LEQ", 269, "GEQ", 270, "EQ", 271, "NEQ", 272, "DEFAULT", 273, "COLONEQ", 274, "OVER", 275, "BARBAR", 276, "HIGHPREC", 277, ";", 59, "LOWPREC", 278, "+", 43, "-", 45, "*", 42, "/", 47, "%", 37, "UNARY", 279, "-unknown-", -1 /* ends search */ }; char * yyreds[] = { "-no such reduction-", "Form : Program", "Form : Directive", "Form : /* empty */", "Directive : '-' Identifier Args", "Program : ProgDecl Identifier '(' ProgramArgList ')' DeclarationList ErrorBlockOrCall", "ProgDecl : /* empty */", "ProgDecl : Identifier", "ProgDecl : ProgDecl Identifier", "ProgramArgList : /* empty */", "ProgramArgList : ProgramArg", "ProgramArgList : ProgramArgList ',' ProgramArg", "ProgramArg : VarTypeList Mutable", "ProgramArg : Identifier", "VarTypeList : Identifier", "VarTypeList : VarTypeList Identifier", "Declaration : VarTypeList MutableList ';'", "DeclarationList : /* empty */", "DeclarationList : DeclarationList Declaration", "Mutable : Identifier Dimension", "MutableList : Mutable", "MutableList : MutableList ',' Mutable", "Dimension : /* empty */", "Dimension : '[' ']'", "Dimension : '[' Exp ']'", "Block : BlockStart '?' Implications '}'", "Block : BlockStart Op Blocks '}'", "Block : BlockStart Blocks '}'", "Block : BlockStart error '}'", "BlockStart : '{'", "Op : BARBAR", "Op : ';'", "Op : '<' LocalCall '>'", "Op : '<' Identifier '>'", "Blocks : Element", "Blocks : Blocks Separator Element", "Separator : ','", "Separator : ';'", "Element : /* empty */", "Element : '!' CallForm", "Element : Call IMPLY MaybeCall", "Element : ErrorInfixOps IMPLY MaybeCall", "Element : '$' Identifier Subscript", "Element : Var COLONEQ Exp", "Element : Var '=' Term", "Element : Var COLONEQ Term error", "Element : Call", "Element : Block", "Element : Identifier OVER Exp DOTS Exp COLONCOLON Element", "Element : LocalCall IN LocalCall", "MaybeCall : /* empty */", "MaybeCall : Call", "MaybeCall : Var '=' Term", "MaybeCall : Var COLONEQ Term", "ErrorInfixOps : Var InfixOp Term", "ErrorInfixOps : Var InfixOp Term ',' ErrorInfixOps", "Call : CallForm", "Implication : /* empty */", "Implication : Guard IMPLY BlockOrCall", "BlockOrCall : Block", "BlockOrCall : Call", "BlockOrCall : Var COLONEQ Exp", "BlockOrCall : Var '=' Term", "ErrorBlockOrCall : Block", "ErrorBlockOrCall : ErrorInfixOps IMPLY MaybeCall", "ErrorBlockOrCall : Call", "ErrorBlockOrCall : Var COLONEQ Exp", "ErrorBlockOrCall : Var '=' Term", "Implications : Implication", "Implications : Implications Separator Implication", "Guard : Tests", "Guard : DEFAULT", "Tests : Test", "Tests : Tests ',' Test", "Test : Term InfixOp Term", "Test : Call", "InfixOp : '<'", "InfixOp : '>'", "InfixOp : LEQ", "InfixOp : GEQ", "InfixOp : EQ", "InfixOp : NEQ", "InfixOp : MATCH", "CallForm : LocalCall", "CallForm : RemoteCall", "RemoteCall : LocalCall '@' Integer", "RemoteCall : LocalCall '@' LocalCall", "RemoteCall : LocalCall '@' Identifier", "LocalCall : QID ':' QID Args", "LocalCall : QID Args", "LocalCall : '`' Identifier '`'", "QID : Identifier", "QID : '`' Identifier '`'", "QID : '`' '$' Identifier '`'", "QID : '$' Identifier", "Args : '(' ')'", "Args : '(' ArgList ')'", "ArgList : Term", "ArgList : ArgList ',' Term", "Term : SymbolicExp", "Term : Exp", "SymbolicExp : String", "SymbolicExp : List", "SymbolicExp : Tuple", "SymbolicExp : ModProc", "SymbolicExp : BlockQuote", "SymbolicExp : BlockQuote QuotedBlock", "QuotedBlock : ModProc BlockQuote", "QuotedBlock : Element BlockQuote", "ModProc : QID ':' QID", "BlockQuote : '^'", "List : '[' ']'", "List : '[' ElementsAsList ']'", "List : '[' ElementsAsList '|' Term ']'", "ElementsAsList : Elements", "Tuple : '{' Elements '}'", "Tuple : '{' '}'", "Elements : Term", "Elements : Elements ',' Term", "Exp : BinaryExp", "Exp : UnaryExp", "Exp : '(' Exp ')'", "Exp : Number", "Exp : Var", "Exp : FunctionCall", "FunctionCall : CallForm", "BinaryExp : Exp '+' Exp", "BinaryExp : Exp '-' Exp", "BinaryExp : Exp '*' Exp", "BinaryExp : Exp '/' Exp", "BinaryExp : Exp '%' Exp", "UnaryExp : '-' Exp", "Number : Double", "Number : Integer", "Double : FLOATINGconstant", "String : STRING", "Integer : IntegerForm", "IntegerForm : INTEGERconstant", "IntegerForm : CHARACTERconstant", "IntegerForm : OCTALconstant", "IntegerForm : HEXconstant", "Var : Identifier Subscript", "Var : '$' Identifier Subscript", "Identifier : ID", "Identifier : IN", "Identifier : OVER", "Subscript : /* empty */", "Subscript : '[' Exp ']'", }; #endif /* YYDEBUG */ #line 1 "/usr/lib/yaccpar" /* @(#)yaccpar 1.10 89/04/04 SMI; from S5R3 1.10 */ /* ** Skeleton parser driver for yacc output */ /* ** yacc user known macros and defines */ #define YYERROR goto yyerrlab #define YYACCEPT { free(yys); free(yyv); return(0); } #define YYABORT { free(yys); free(yyv); return(1); } #define YYBACKUP( newtoken, newvalue )\ {\ if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\ {\ yyerror( "syntax error - cannot backup" );\ goto yyerrlab;\ }\ yychar = newtoken;\ yystate = *yyps;\ yylval = newvalue;\ goto yynewstate;\ } #define YYRECOVERING() (!!yyerrflag) #ifndef YYDEBUG # define YYDEBUG 1 /* make debugging available */ #endif /* ** user known globals */ int yydebug; /* set to 1 to get debugging */ /* ** driver internal defines */ #define YYFLAG (-1000) /* ** static variables used by the parser */ static YYSTYPE *yyv; /* value stack */ static int *yys; /* state stack */ static YYSTYPE *yypv; /* top of value stack */ static int *yyps; /* top of state stack */ static int yystate; /* current state */ static int yytmp; /* extra var (lasts between blocks) */ int yynerrs; /* number of errors */ int yyerrflag; /* error recovery flag */ int yychar; /* current input token number */ /* ** yyparse - return 0 if worked, 1 if syntax error not recovered from */ int yyparse() { register YYSTYPE *yypvt; /* top of value stack for $vars */ unsigned yymaxdepth = YYMAXDEPTH; /* ** Initialize externals - yyparse may be called more than once */ yyv = (YYSTYPE*)malloc(yymaxdepth*sizeof(YYSTYPE)); yys = (int*)malloc(yymaxdepth*sizeof(int)); if (!yyv || !yys) { yyerror( "out of memory" ); return(1); } yypv = &yyv[-1]; yyps = &yys[-1]; yystate = 0; yytmp = 0; yynerrs = 0; yyerrflag = 0; yychar = -1; goto yystack; { register YYSTYPE *yy_pv; /* top of value stack */ register int *yy_ps; /* top of state stack */ register int yy_state; /* current state */ register int yy_n; /* internal state number info */ /* ** get globals into registers. ** branch to here only if YYBACKUP was called. */ yynewstate: yy_pv = yypv; yy_ps = yyps; yy_state = yystate; goto yy_newstate; /* ** get globals into registers. ** either we just started, or we just finished a reduction */ yystack: yy_pv = yypv; yy_ps = yyps; yy_state = yystate; /* ** top of for (;;) loop while no reductions done */ yy_stack: /* ** put a state and value onto the stacks */ #if YYDEBUG /* ** if debugging, look up token value in list of value vs. ** name pairs. 0 and negative (-1) are special values. ** Note: linear search is used since time is not a real ** consideration while debugging. */ if ( yydebug ) { register int yy_i; (void)printf( "State %d, token ", yy_state ); if ( yychar == 0 ) (void)printf( "end-of-file\n" ); else if ( yychar < 0 ) (void)printf( "-none-\n" ); else { for ( yy_i = 0; yytoks[yy_i].t_val >= 0; yy_i++ ) { if ( yytoks[yy_i].t_val == yychar ) break; } (void)printf( "%s\n", yytoks[yy_i].t_name ); } } #endif /* YYDEBUG */ if ( ++yy_ps >= &yys[ yymaxdepth ] ) /* room on stack? */ { /* ** reallocate and recover. Note that pointers ** have to be reset, or bad things will happen */ int yyps_index = (yy_ps - yys); int yypv_index = (yy_pv - yyv); int yypvt_index = (yypvt - yyv); yymaxdepth += YYMAXDEPTH; yyv = (YYSTYPE*)realloc((char*)yyv, yymaxdepth * sizeof(YYSTYPE)); yys = (int*)realloc((char*)yys, yymaxdepth * sizeof(int)); if (!yyv || !yys) { yyerror( "yacc stack overflow" ); return(1); } yy_ps = yys + yyps_index; yy_pv = yyv + yypv_index; yypvt = yyv + yypvt_index; } *yy_ps = yy_state; *++yy_pv = yyval; /* ** we have a new state - find out what to do */ yy_newstate: if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG ) goto yydefault; /* simple state */ #if YYDEBUG /* ** if debugging, need to mark whether new token grabbed */ yytmp = yychar < 0; #endif if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) yychar = 0; /* reached EOF */ #if YYDEBUG if ( yydebug && yytmp ) { register int yy_i; (void)printf( "Received token " ); if ( yychar == 0 ) (void)printf( "end-of-file\n" ); else if ( yychar < 0 ) (void)printf( "-none-\n" ); else { for ( yy_i = 0; yytoks[yy_i].t_val >= 0; yy_i++ ) { if ( yytoks[yy_i].t_val == yychar ) break; } (void)printf( "%s\n", yytoks[yy_i].t_name ); } } #endif /* YYDEBUG */ if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) ) goto yydefault; if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/ { yychar = -1; yyval = yylval; yy_state = yy_n; if ( yyerrflag > 0 ) yyerrflag--; goto yy_stack; } yydefault: if ( ( yy_n = yydef[ yy_state ] ) == -2 ) { #if YYDEBUG yytmp = yychar < 0; #endif if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) yychar = 0; /* reached EOF */ #if YYDEBUG if ( yydebug && yytmp ) { register int yy_i; (void)printf( "Received token " ); if ( yychar == 0 ) (void)printf( "end-of-file\n" ); else if ( yychar < 0 ) (void)printf( "-none-\n" ); else { for ( yy_i = 0; yytoks[yy_i].t_val >= 0; yy_i++ ) { if ( yytoks[yy_i].t_val == yychar ) { break; } } (void)printf( "%s\n", yytoks[yy_i].t_name ); } } #endif /* YYDEBUG */ /* ** look through exception table */ { register int *yyxi = yyexca; while ( ( *yyxi != -1 ) || ( yyxi[1] != yy_state ) ) { yyxi += 2; } while ( ( *(yyxi += 2) >= 0 ) && ( *yyxi != yychar ) ) ; if ( ( yy_n = yyxi[1] ) < 0 ) YYACCEPT; } } /* ** check for syntax error */ if ( yy_n == 0 ) /* have an error */ { /* no worry about speed here! */ switch ( yyerrflag ) { case 0: /* new error */ yyerror( "syntax error" ); goto skip_init; yyerrlab: /* ** get globals into registers. ** we have a user generated syntax type error */ yy_pv = yypv; yy_ps = yyps; yy_state = yystate; yynerrs++; skip_init: case 1: case 2: /* incompletely recovered error */ /* try again... */ yyerrflag = 3; /* ** find state where "error" is a legal ** shift action */ while ( yy_ps >= yys ) { yy_n = yypact[ *yy_ps ] + YYERRCODE; if ( yy_n >= 0 && yy_n < YYLAST && yychk[yyact[yy_n]] == YYERRCODE) { /* ** simulate shift of "error" */ yy_state = yyact[ yy_n ]; goto yy_stack; } /* ** current state has no shift on ** "error", pop stack */ #if YYDEBUG # define _POP_ "Error recovery pops state %d, uncovers state %d\n" if ( yydebug ) (void)printf( _POP_, *yy_ps, yy_ps[-1] ); # undef _POP_ #endif yy_ps--; yy_pv--; } /* ** there is no state on stack with "error" as ** a valid shift. give up. */ YYABORT; case 3: /* no shift yet; eat a token */ #if YYDEBUG /* ** if debugging, look up token in list of ** pairs. 0 and negative shouldn't occur, ** but since timing doesn't matter when ** debugging, it doesn't hurt to leave the ** tests here. */ if ( yydebug ) { register int yy_i; (void)printf( "Error recovery discards " ); if ( yychar == 0 ) (void)printf( "token end-of-file\n" ); else if ( yychar < 0 ) (void)printf( "token -none-\n" ); else { for ( yy_i = 0; yytoks[yy_i].t_val >= 0; yy_i++ ) { if ( yytoks[yy_i].t_val == yychar ) { break; } } (void)printf( "token %s\n", yytoks[yy_i].t_name ); } } #endif /* YYDEBUG */ if ( yychar == 0 ) /* reached EOF. quit */ YYABORT; yychar = -1; goto yy_newstate; } }/* end if ( yy_n == 0 ) */ /* ** reduction by production yy_n ** put stack tops, etc. so things right after switch */ #if YYDEBUG /* ** if debugging, print the string that is the user's ** specification of the reduction which is just about ** to be done. */ if ( yydebug ) (void)printf( "Reduce by (%d) \"%s\"\n", yy_n, yyreds[ yy_n ] ); #endif yytmp = yy_n; /* value to switch over */ yypvt = yy_pv; /* $vars top of value stack */ /* ** Look in goto table for next state ** Sorry about using yy_state here as temporary ** register variable, but why not, if it works... ** If yyr2[ yy_n ] doesn't have the low order bit ** set, then there is no action to be done for ** this reduction. So, no saving & unsaving of ** registers done. The only difference between the ** code just after the if and the body of the if is ** the goto yy_stack in the body. This way the test ** can be made before the choice of what to do is needed. */ { /* length of production doubled with extra bit */ register int yy_len = yyr2[ yy_n ]; if ( !( yy_len & 01 ) ) { yy_len >>= 1; yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + *( yy_ps -= yy_len ) + 1; if ( yy_state >= YYLAST || yychk[ yy_state = yyact[ yy_state ] ] != -yy_n ) { yy_state = yyact[ yypgo[ yy_n ] ]; } goto yy_stack; } yy_len >>= 1; yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + *( yy_ps -= yy_len ) + 1; if ( yy_state >= YYLAST || yychk[ yy_state = yyact[ yy_state ] ] != -yy_n ) { yy_state = yyact[ yypgo[ yy_n ] ]; } } /* save until reenter driver code */ yystate = yy_state; yyps = yy_ps; yypv = yy_pv; } /* ** code supplied by user is placed in this switch */ switch( yytmp ) { case 1: # line 63 "../../../../../src/compiler/parser/gram.y" { _p_co_parse_done_flag = 1; _p_co_parse_tree = yypvt[-0]; } break; case 2: # line 68 "../../../../../src/compiler/parser/gram.y" { _p_co_parse_tree = yypvt[-0]; _p_co_parse_done_flag = 1; } break; case 3: # line 73 "../../../../../src/compiler/parser/gram.y" { _p_co_parse_tree = _p_co_nil(); _p_co_parse_completely_done_flag = 1; } break; case 4: # line 89 "../../../../../src/compiler/parser/gram.y" { datum *name, *args, *ident, *dir, *out; if (strcmp(D_SVAL(yypvt[-1]), "directive") == 0) { /* We have a "-directive" form. Grab the * first argument as the directive name. */ name = D_CAR(D_LHEAD(yypvt[-0])); if (!(D_IS_TUPLE(name) && D_NARGS(name) == 2 && D_IS_TAG(D_ARG(name, 0)) && D_IS_STRING(D_ARG(name, 1)))) { SyntaxError("Invalid -directive directive: First argument must be a string"); name = _p_co_new_string("<invalid_name>"); } else { name = D_ARG(name, 1); } D_LHEAD(yypvt[-0]) = D_CDR(D_LHEAD(yypvt[-0])); args = yypvt[-0]; } else { name = yypvt[-1]; args = yypvt[-0]; } D_NEW_TUPLE_3(ident, D_TAG_COLON, _p_co_current_module, name); D_NEW_TUPLE_2(dir, D_TAG_DIRECTIVE, args); D_NEW_TUPLE_3(out, ident, _p_co_new_integer(_p_co_l_temp_max), dir); /* Return the output as a 1-element list */ D_NEW_TUPLE_2(yyval, out, _p_co_nil()); } break; case 5: # line 137 "../../../../../src/compiler/parser/gram.y" { datum *ident, *prog, *directive, *tail, *pair; D_NEW_TUPLE_3(ident, D_TAG_COLON, _p_co_current_module, yypvt[-5]); /* If we have program annotations, pass them * through as a directive _program_annotations. */ if (!D_IS_NIL(yypvt[-6])) { datum *t1, *t2, *t3; D_NEW_TUPLE_2(t1, D_TAG_DIRECTIVE, _p_co_cons(yypvt[-5], UNLIST(yypvt[-6]))); D_NEW_TUPLE_3(t2, D_TAG_COLON, _p_co_current_module, _p_co_new_string("_program_annotations")); D_NEW_TUPLE_2(t3, t2, t1); D_NEW_TUPLE_2(tail, t3, _p_co_nil()); } else { tail = _p_co_nil(); } /* We really need to walk the ProgramArgList here * to find occurrences of {type, var}, replace * them with just var, and add an entry to * the declaration list. * * But for simplicity, we're doing that in a * postprocessing stage. */ D_NEW_TUPLE_4(prog, D_TAG_PROGRAM, UNLIST(yypvt[-3]), UNLIST(yypvt[-1]), yypvt[-0]); D_NEW_TUPLE_3(pair, ident, _p_co_new_integer(_p_co_l_temp_max), prog); D_NEW_TUPLE_2(yyval, pair, tail); } break; case 6: # line 186 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_nil(); } break; case 7: # line 190 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_list(yypvt[-0]); } break; case 8: # line 195 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_append_list(yypvt[-1], yypvt[-0]); } break; case 9: # line 201 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_nil(); } break; case 10: # line 205 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_list(yypvt[-0]); } break; case 11: # line 209 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_append_list(yypvt[-2], yypvt[-0]); } break; case 12: # line 215 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_2(yyval, yypvt[-1], yypvt[-0]); } break; case 13: # line 219 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_3(yyval, D_TAG_VAR, yypvt[-0], _p_co_nil()); } break; case 14: # line 225 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_list(yypvt[-0]); } break; case 15: # line 229 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_append_list(yypvt[-1], yypvt[-0]); } break; case 16: # line 235 "../../../../../src/compiler/parser/gram.y" { datum *l, *t; yyval = _p_co_nil(); for (l = REAL_UNLIST(yypvt[-1]); D_IS_TUPLE(l); l = D_CDR(l)) { D_NEW_TUPLE_2(t, yypvt[-2], D_CAR(l)); yyval = _p_co_append_list(yyval, t); } } break; case 17: # line 249 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_nil(); } break; case 18: # line 253 "../../../../../src/compiler/parser/gram.y" { /* Perform some list surgery to do list appends * without traversing the list. * * _p_co_append_list() doesn't work since it expects * the second argument to be an element, not a list. */ if (D_IS_NIL(yypvt[-1])) { yyval = yypvt[-0]; } else if (!D_IS_LIST(yypvt[-1])) { printf("ACK!\n"); _p_co_print(yypvt[-1]); exit(1); } else { /* Memory leak here, in the list datum for $2 */ *(D_LTAIL(yypvt[-1])) = D_LHEAD(yypvt[-0]); D_LTAIL(yypvt[-1]) = D_LTAIL(yypvt[-0]); yyval = yypvt[-1]; } } break; case 19: # line 283 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_3(yyval, D_TAG_VAR, yypvt[-1], yypvt[-0]); } break; case 20: # line 289 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_list(yypvt[-0]); } break; case 21: # line 293 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_append_list(yypvt[-2], yypvt[-0]); } break; case 22: # line 299 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_nil(); } break; case 23: # line 303 "../../../../../src/compiler/parser/gram.y" { datum *zero; zero = _p_co_new_tuple_2(D_TAG_INTEGER_CONST, _p_co_new_string("0")); yyval = _p_co_new_tuple_2(D_TAG_TUPLE, _p_co_new_tuple_2(zero, _p_co_new_tuple_2(D_TAG_TUPLE, _p_co_nil()))); } break; case 24: # line 314 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_2(D_TAG_TUPLE, _p_co_new_tuple_2(yypvt[-1], _p_co_new_tuple_2(D_TAG_TUPLE, _p_co_nil()))); } break; case 25: # line 323 "../../../../../src/compiler/parser/gram.y" { block_depth--; D_NEW_TUPLE_3(yyval, D_TAG_BLOCK, D_TAG_CHOICE_COMP, UNLIST(yypvt[-1])); } break; case 26: # line 329 "../../../../../src/compiler/parser/gram.y" { block_depth--; D_NEW_TUPLE_3(yyval, D_TAG_BLOCK, yypvt[-2], UNLIST(yypvt[-1])); } break; case 27: # line 335 "../../../../../src/compiler/parser/gram.y" { printf("%s:%d: Warning: Implicit block operator used\n", _p_co_filename, block_start_line[block_depth]); block_depth--; D_NEW_TUPLE_3(yyval, D_TAG_BLOCK, D_TAG_SEQ_COMP, UNLIST(yypvt[-1])); } break; case 28: # line 344 "../../../../../src/compiler/parser/gram.y" { block_depth--; SyntaxError("Invalid block"); yyval = _p_co_nil(); } break; case 29: # line 352 "../../../../../src/compiler/parser/gram.y" { block_depth++; block_start_line[block_depth] = _p_co_lineno; } break; case 30: # line 359 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_PAR_COMP; } break; case 31: # line 363 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_SEQ_COMP; } break; case 32: # line 368 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_2(yyval, D_TAG_USER_DEF_COMP, yypvt[-1]); } break; case 33: # line 372 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_2(yyval, D_TAG_USER_DEF_COMP, yypvt[-1]); } break; case 34: # line 378 "../../../../../src/compiler/parser/gram.y" { if (yypvt[-0] == NULL) yyval = _p_co_nil(); else yyval = _p_co_new_list(yypvt[-0]); } break; case 35: # line 385 "../../../../../src/compiler/parser/gram.y" { if (yypvt[-0] == NULL) yyval = yypvt[-2]; else yyval = _p_co_append_list(yypvt[-2], yypvt[-0]); } break; case 38: # line 398 "../../../../../src/compiler/parser/gram.y" { _p_co_warning("Encountered empty element"); yyval = NULL; } break; case 39: # line 403 "../../../../../src/compiler/parser/gram.y" { _p_co_warning("Capabilities are no longer supported"); yyval = _p_co_new_tuple_2(D_TAG_CAPABILITY, yypvt[-0]); } break; case 40: # line 409 "../../../../../src/compiler/parser/gram.y" { SyntaxError("Implications must be within choice blocks"); if (block_depth > 1) _p_co_push_token = ';'; yyval = NULL; } break; case 41: # line 422 "../../../../../src/compiler/parser/gram.y" { SyntaxError("Implications must be within choice blocks"); /* * If we're not in a toplevel block, arrange * for a separator to be the next token * shifted by the parser. See the * YY_INPUT macro in lex.l. */ if (block_depth > 1) _p_co_push_token = ';'; yyval = NULL; } break; case 42: # line 436 "../../../../../src/compiler/parser/gram.y" { if (!in_quoted_block) { SyntaxError("Bare variables not allowed outside quoted blocks"); yyval = NULL; YYERROR; } else { yyval = _p_co_new_tuple_3(D_TAG_INTERP_VAR, yypvt[-1], yypvt[-0]); } } break; case 43: # line 449 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_3(yyval, D_TAG_PRIM, D_TAG_ASSIGN, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); } break; case 44: # line 455 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_3(yyval, D_TAG_PRIM, D_TAG_DEFINE, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); } break; case 45: # line 461 "../../../../../src/compiler/parser/gram.y" { SyntaxError("The RHS of an assignment statement must be a numeric expression"); yyval = NULL; } break; case 48: # line 468 "../../../../../src/compiler/parser/gram.y" { datum *var; D_NEW_TUPLE_3(var, D_TAG_VAR, yypvt[-6], _p_co_nil()); D_NEW_TUPLE_5(yyval, D_TAG_OVER, var, yypvt[-4], yypvt[-2], yypvt[-0]); } break; case 49: # line 479 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_3(yyval, D_TAG_IN, yypvt[-2], yypvt[-0]); } break; case 57: # line 503 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_nil(); } break; case 58: # line 507 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_3(D_TAG_IMPLIES, yypvt[-2], yypvt[-0]); } break; case 60: # line 514 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_3(D_TAG_BLOCK, D_TAG_PAR_COMP, _p_co_new_list(yypvt[-0])); } break; case 61: # line 519 "../../../../../src/compiler/parser/gram.y" { datum *asgn; asgn = _p_co_new_tuple_3(D_TAG_PRIM, D_TAG_ASSIGN, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); yyval = _p_co_new_tuple_3(D_TAG_BLOCK, D_TAG_PAR_COMP, _p_co_new_list(asgn)); } break; case 62: # line 529 "../../../../../src/compiler/parser/gram.y" { asgn = _p_co_new_tuple_3(D_TAG_PRIM, D_TAG_DEFINE, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); yyval = _p_co_new_tuple_3(D_TAG_BLOCK, D_TAG_PAR_COMP, _p_co_new_list(asgn)); } break; case 64: # line 546 "../../../../../src/compiler/parser/gram.y" { SyntaxError("Implications must be within choice blocks"); /* * If we're not in a toplevel block, arrange * for a separator to be the next token * shifted by the parser. See the * YY_INPUT macro in lex.l. */ if (block_depth > 1) _p_co_push_token = ';'; yyval = NULL; } break; case 65: # line 559 "../../../../../src/compiler/parser/gram.y" { SyntaxError("Bare calls are not allowed"); yyval = _p_co_new_tuple_3(D_TAG_BLOCK, D_TAG_SEQ_COMP, _p_co_new_list(yypvt[-0])); } break; case 66: # line 565 "../../../../../src/compiler/parser/gram.y" { SyntaxError("Bare calls are not allowed"); yyval = _p_co_new_tuple_3(D_TAG_BLOCK, D_TAG_SEQ_COMP, _p_co_new_list(yypvt[-2])); } break; case 67: # line 571 "../../../../../src/compiler/parser/gram.y" { SyntaxError("Bare calls are not allowed"); yyval = _p_co_new_tuple_3(D_TAG_BLOCK, D_TAG_SEQ_COMP, _p_co_new_list(yypvt[-2])); } break; case 68: # line 579 "../../../../../src/compiler/parser/gram.y" { if (D_IS_NIL(yypvt[-0])) yyval = yypvt[-0]; else yyval = _p_co_new_list(yypvt[-0]); } break; case 69: # line 586 "../../../../../src/compiler/parser/gram.y" { if (D_IS_NIL(yypvt[-0])) yyval = yypvt[-2]; else yyval = _p_co_append_list(yypvt[-2], yypvt[-0]); } break; case 70: # line 595 "../../../../../src/compiler/parser/gram.y" { yyval = UNLIST(yypvt[-0]); } break; case 71: # line 599 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_DEFAULT; } break; case 72: # line 605 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_list(yypvt[-0]); } break; case 73: # line 609 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_append_list(yypvt[-2], yypvt[-0]); } break; case 74: # line 615 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_4(yyval, D_TAG_GUARD_INFIX_OP, yypvt[-1], yypvt[-2], yypvt[-0]); } break; case 75: # line 619 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_2(D_TAG_GUARD_CALL, yypvt[-0]); } break; case 76: # line 625 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_LESS_THAN; } break; case 77: # line 629 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_GREATER_THAN; } break; case 78: # line 633 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_LESS_EQUAL; } break; case 79: # line 637 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_GREATER_EQUAL; } break; case 80: # line 641 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_EQUAL; } break; case 81: # line 645 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_NOT_EQUAL; } break; case 82: # line 649 "../../../../../src/compiler/parser/gram.y" { yyval = D_TAG_MATCH; } break; case 85: # line 659 "../../../../../src/compiler/parser/gram.y" { yyval = yypvt[-2]; _p_co_set_arg(yyval, 3, yypvt[-0]); } break; case 86: # line 664 "../../../../../src/compiler/parser/gram.y" { yyval = yypvt[-2]; _p_co_set_arg(yyval, 3, yypvt[-0]); } break; case 87: # line 669 "../../../../../src/compiler/parser/gram.y" { yyval = yypvt[-2]; _p_co_set_arg(yyval, 3, _p_co_new_tuple_4(D_TAG_CALL, yypvt[-0], _p_co_nil(), _p_co_nil())); } break; case 88: # line 677 "../../../../../src/compiler/parser/gram.y" { datum *ident = _p_co_new_tuple_3(D_TAG_COLON, yypvt[-3], yypvt[-1]); yyval = _p_co_new_tuple_4(D_TAG_CALL, ident, yypvt[-0], _p_co_nil()); } break; case 89: # line 682 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_4(D_TAG_CALL, yypvt[-1], yypvt[-0], _p_co_nil()); } break; case 90: # line 686 "../../../../../src/compiler/parser/gram.y" { /* This parses as * {CALL, {COLON, "_metacall", var}, [], []} */ yyval = _p_co_new_tuple_4(D_TAG_CALL, _p_co_new_tuple_3(D_TAG_COLON, _p_co_new_string("_metacall"), _p_co_new_tuple_3(D_TAG_VAR, yypvt[-1], _p_co_nil())), _p_co_nil(), _p_co_nil()); } break; case 92: # line 701 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_3(D_TAG_VAR, yypvt[-1], _p_co_nil()); } break; case 93: # line 705 "../../../../../src/compiler/parser/gram.y" { if (in_quoted_block) yyval = _p_co_new_tuple_3(D_TAG_VAR, _p_co_new_tuple_3(D_TAG_INTERP_VAR, yypvt[-1], _p_co_nil()), _p_co_nil()); else { SyntaxError("$-quoted procedure calls not allowed outside quoted blocks"); yyval = _p_co_nil(); YYERROR; } } break; case 94: # line 716 "../../../../../src/compiler/parser/gram.y" { if (in_quoted_block) yyval = _p_co_new_tuple_3(D_TAG_INTERP_VAR, yypvt[-0], _p_co_nil()); else { SyntaxError("$-quoted procedure calls not allowed outside quoted blocks"); yyval = _p_co_nil(); YYERROR; } } break; case 95: # line 729 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_nil(); } break; case 96: # line 733 "../../../../../src/compiler/parser/gram.y" { yyval = UNLIST(yypvt[-1]); } break; case 97: # line 739 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_list(yypvt[-0]); } break; case 98: # line 743 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_append_list(yypvt[-2], yypvt[-0]); } break; case 105: # line 756 "../../../../../src/compiler/parser/gram.y" { in_quoted_block = 1; } break; case 106: # line 757 "../../../../../src/compiler/parser/gram.y" { yyval = yypvt[-0]; in_quoted_block = 0; } break; case 107: # line 761 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_quoted_block(yypvt[-1]); } break; case 108: # line 765 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_quoted_block(yypvt[-1]); } break; case 109: # line 771 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple(3); _p_co_set_arg(yyval, 0, D_TAG_COLON); _p_co_set_arg(yyval, 1, yypvt[-2]); _p_co_set_arg(yyval, 2, yypvt[-0]); } break; case 111: # line 784 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple(2); _p_co_set_arg(yyval, 0, D_TAG_TUPLE); _p_co_set_arg(yyval, 1, _p_co_nil()); } break; case 112: # line 790 "../../../../../src/compiler/parser/gram.y" { yyval = D_LHEAD(yypvt[-1]); } break; case 113: # line 794 "../../../../../src/compiler/parser/gram.y" { *(D_LTAIL(yypvt[-3])) = yypvt[-1]; yyval = D_LHEAD(yypvt[-3]); } break; case 114: # line 801 "../../../../../src/compiler/parser/gram.y" { int len, i; datum *d, **tail, *new, *new2; datum *head; tail = &head; for (d = REAL_UNLIST(yypvt[-0]); !D_IS_NIL(d); d = D_CDR(d)) { new2 = _p_co_new_tuple(2); new = _p_co_new_tuple_2(D_TAG_TUPLE, new2); *tail = new; _p_co_set_arg(new2, 0, D_CAR(d)); tail = &D_CDR(new2); } *tail = _p_co_new_tuple_2(D_TAG_TUPLE, _p_co_nil()); yyval = _p_co_new_list_0(); D_LHEAD(yyval) = head; D_LTAIL(yyval) = tail; } break; case 115: # line 830 "../../../../../src/compiler/parser/gram.y" { int len, i; datum *d, *tup; len = 0; for (d = REAL_UNLIST(yypvt[-1]); !D_IS_NIL(d); d = D_CDR(d)) len++; tup = _p_co_new_tuple(len); i = 0; for (d = REAL_UNLIST(yypvt[-1]); !D_IS_NIL(d); d = D_CDR(d)) { _p_co_set_arg(tup, i, D_CAR(d)); i++; } yyval = _p_co_new_tuple(2); _p_co_set_arg(yyval, 0, D_TAG_TUPLE); _p_co_set_arg(yyval, 1, tup); } break; case 116: # line 853 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple(2); _p_co_set_arg(yyval, 0, D_TAG_TUPLE); _p_co_set_arg(yyval, 1, _p_co_nil()); } break; case 117: # line 861 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_list(yypvt[-0]); } break; case 118: # line 865 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_append_list(yypvt[-2], yypvt[-0]); } break; case 121: # line 873 "../../../../../src/compiler/parser/gram.y" { yyval = yypvt[-1]; } break; case 125: # line 882 "../../../../../src/compiler/parser/gram.y" { if (!_p_co_backward_compatibility_flag) { yyval = yypvt[-0]; } else { /* * We have {CALL, ident, arglist, anno} * * and we want to create {"name", arg1, arg2, ...} * or {":", "mod", {"name", arg1, arg2, ...}} * */ datum *tup, *d, *result; datum *ident, *args; int len, i; int have_length = 0; ident = D_ARG(yypvt[-0], 1); args = D_ARG(yypvt[-0], 2); len = 0; for (d = REAL_UNLIST(args); !D_IS_NIL(d); d = D_CDR(d)) len++; /* * len is the length of the argument list */ tup = _p_co_new_tuple(len + 1); /* We are creating the {"name", arg1, arg2, ...} tuple in * tup. * * Result is the tuple that will be returned (wrapped in * a TAG_TUPLE). Depending on whether we have p() or * m:p(), we set result to either tup or mp. */ if (D_IS_STRING(ident)) { /* We check for occurrences of the length() primitive * here, since it gets real tough later on * (since {"length", f} is exactly the same as * length(f). */ D_ARG(tup, 0) = _p_co_new_tuple_2(D_TAG_STRING_CONST, ident); if (strcmp(D_SVAL(ident), "length") == 0 && len == 1) { args = REAL_UNLIST(args); /* Rewrite the length call as an expression. */ yyval = _p_co_new_tuple_3(D_TAG_EXP, D_TAG_LENGTH, _p_co_cons(D_ARG(args, 0), _p_co_nil())); have_length = 1; } else { /* We return tup */ result = tup; } } else if (D_IS_TUPLE(ident) && D_NARGS(ident) == 3 && D_IS_TAG(D_ARG(ident, 0)) && D_IVAL(D_ARG(ident, 0)) == TAG_COLON) { datum *mp = _p_co_new_tuple(3); /* * Create mp to be the tuple * {":", "mod", tup} */ D_ARG(mp, 0) = _p_co_new_tuple_2(D_TAG_STRING_CONST, _p_co_new_string(":")); D_ARG(mp, 1) = _p_co_new_tuple_2(D_TAG_STRING_CONST, D_ARG(ident,1)); D_ARG(mp, 2) = _p_co_new_tuple_2(D_TAG_TUPLE, tup); /* * and fill in tup[0] with "name" */ D_ARG(tup, 0) = _p_co_new_tuple_2(D_TAG_STRING_CONST, D_ARG(ident,2)); /* We return mp */ result = mp; } if (!have_length) { /* * Fill in the arguments of tup */ i = 0; for (d = REAL_UNLIST(args); !D_IS_NIL(d); d = D_CDR(d)) { _p_co_set_arg(tup, i+1, D_CAR(d)); i++; } yyval = _p_co_new_tuple_2(D_TAG_TUPLE, result); } } } break; case 126: # line 1004 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_3(D_TAG_EXP, D_TAG_PLUS, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); } break; case 127: # line 1011 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_3(D_TAG_EXP, D_TAG_MINUS, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); } break; case 128: # line 1018 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_3(D_TAG_EXP, D_TAG_TIMES, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); } break; case 129: # line 1025 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_3(D_TAG_EXP, D_TAG_DIV, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); } break; case 130: # line 1032 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_3(D_TAG_EXP, D_TAG_MODULO, _p_co_cons(yypvt[-2], _p_co_cons(yypvt[-0], _p_co_nil()))); } break; case 131: # line 1041 "../../../../../src/compiler/parser/gram.y" { datum *zero; datum *a0, *a1; a0 = D_ARG(yypvt[-0], 0); a1 = D_ARG(yypvt[-0], 1); if (D_IS_TAG(a0) && (D_IVAL(a0) == TAG_INTEGER_CONST || D_IVAL(a0) == TAG_DOUBLE_CONST) && D_IS_STRING(a1)) { /* * We have a negated constant. Stash a * '-' at the beginning of the string. */ char *str, *new; str = D_SVAL(a1); new = (char *) malloc(strlen(str) + 2); strcpy(new, "-"); strcat(new, str); D_SVAL(a1) = new; free(str); yyval = yypvt[-0]; } else { zero = _p_co_new_tuple_2(D_TAG_INTEGER_CONST, _p_co_new_string("0")); yyval = _p_co_new_tuple_3(D_TAG_EXP, D_TAG_MINUS, _p_co_cons(zero, _p_co_cons(yypvt[-0], _p_co_nil()))); } } break; case 134: # line 1085 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple(2); _p_co_set_arg(yyval, 0, D_TAG_DOUBLE_CONST); _p_co_set_arg(yyval, 1, yypvt[-0]); } break; case 135: # line 1094 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple(2); _p_co_set_arg(yyval, 0, D_TAG_STRING_CONST); _p_co_set_arg(yyval, 1, yypvt[-0]); } break; case 136: # line 1101 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple(2); _p_co_set_arg(yyval, 0, D_TAG_INTEGER_CONST); _p_co_set_arg(yyval, 1, yypvt[-0]); } break; case 141: # line 1114 "../../../../../src/compiler/parser/gram.y" { D_NEW_TUPLE_3(yyval, D_TAG_VAR, yypvt[-1], yypvt[-0]); _p_co_check_var_for_temp_max(yypvt[-1]); } break; case 142: # line 1120 "../../../../../src/compiler/parser/gram.y" { if (in_quoted_block) { D_NEW_TUPLE_3(yyval, D_TAG_INTERP_VAR, yypvt[-1], yypvt[-0]); } else { SyntaxError("$vars not allowed outside quoted blocks"); yyval = _p_co_nil(); YYERROR; } _p_co_check_var_for_temp_max(yypvt[-1]); } break; case 143: # line 1141 "../../../../../src/compiler/parser/gram.y" { yyval = yypvt[-0]; } break; case 144: # line 1145 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_string("in"); } break; case 145: # line 1150 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_string("over"); } break; case 146: # line 1156 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_nil(); } break; case 147: # line 1160 "../../../../../src/compiler/parser/gram.y" { yyval = _p_co_new_tuple_2(D_TAG_TUPLE, _p_co_new_tuple_2(yypvt[-1], _p_co_new_tuple_2(D_TAG_TUPLE, _p_co_nil()))); } break; } goto yystack; /* reset registers in driver code */ }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.