|
|
1.1 ! root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ ! 2: ! 3: /* ! 4: * $Header: tabl.c,v 2.4 85/08/22 16:08:42 timo Exp $ ! 5: */ ! 6: ! 7: /* ! 8: * B editor -- Grammar table. ! 9: */ ! 10: ! 11: #include "b.h" ! 12: #include "node.h" ! 13: #include "gram.h" ! 14: #include "tabl.h" ! 15: ! 16: ! 17: /* ! 18: * ***** DISCLAIMER ***** ! 19: * ! 20: * This file is a mess. There should really be a separate program (like Yacc) ! 21: * to compile a grammar into tables. But for the time being . . . ! 22: */ ! 23: ! 24: ! 25: /* ! 26: * Values returned by function symbol(n). ! 27: * They are used directly as index in the grammar table. ! 28: * The NAMES of the #defined constants are of no importance outside this file. ! 29: */ ! 30: ! 31: #define Put 1 ! 32: #define Insert 2 ! 33: #define Remove 3 ! 34: #define Choose 4 ! 35: #define Draw 5 ! 36: #define Set_random 6 ! 37: #define Delete 7 ! 38: #define Check 8 ! 39: #define Share 9 ! 40: ! 41: #define Write 10 ! 42: #define Read 11 ! 43: #define Read_raw 12 ! 44: ! 45: #define If 13 ! 46: #define While 14 ! 47: #define For 15 ! 48: ! 49: #define Select 16 ! 50: ! 51: #define Quit 18 ! 52: #define Return 19 ! 53: #define Report 20 ! 54: #define Succeed 21 ! 55: #define Fail 22 ! 56: ! 57: #define How_to 23 ! 58: #define Yield 24 ! 59: #define Test 25 ! 60: #define Suite 26 ! 61: #define Refinement 27 ! 62: ! 63: #define Compound 28 ! 64: #define Collateral 29 ! 65: #define Tag 30 ! 66: #define Number 31 ! 67: #define Selection 32 ! 68: #define Behead 33 ! 69: #define Curtail 34 ! 70: ! 71: #define And 35 ! 72: #define Or 36 ! 73: #define Not 37 ! 74: #define Some_in 38 ! 75: #define Each_in 39 ! 76: #define No_in 40 ! 77: #define Some_parsing 41 ! 78: #define Each_parsing 42 ! 79: #define No_parsing 43 ! 80: ! 81: #define Comment 44 ! 82: #define Keyword 45 ! 83: ! 84: #define L_t_dis 46 ! 85: #define List_body 47 ! 86: #define Tab_body 48 ! 87: #define Tab_entry 49 ! 88: ! 89: #define E_number 50 ! 90: #define Com_target 51 ! 91: #define Col_target 52 ! 92: #define Sel_expr 53 ! 93: #define Text1 54 ! 94: #define Text2 55 ! 95: #define Grouped 56 ! 96: #define Blocked 57 ! 97: #define Operators 58 ! 98: ! 99: #define Else_kw 59 ! 100: #define Kw_plus 60 ! 101: #define E_plus 61 ! 102: #define Conversion 62 ! 103: #define T1 63 ! 104: #define T1_plus 64 ! 105: #define T2 65 ! 106: #define T2_plus 66 ! 107: #define Cmt_cmd 67 ! 108: ! 109: #define F_kw_plus 69 ! 110: #define F_e_plus 70 ! 111: #define Plus_sign 71 ! 112: #define Minus_sign 72 ! 113: ! 114: #define Long_comp 73 ! 115: #define Short_comp 74 ! 116: #define Cmt_comp 75 ! 117: ! 118: #define Long_unit 76 ! 119: #define Short_unit 77 ! 120: #define Cmt_head 78 ! 121: ! 122: #define Ref_join 79 ! 123: ! 124: #define And_kw 80 ! 125: #define Or_kw 81 ! 126: ! 127: #define E_part 82 ! 128: ! 129: #define Unit_edit 83 ! 130: #define Target_edit 84 ! 131: #define Imm_cmd 85 ! 132: #define Raw 86 ! 133: #define Raw_input 87 ! 134: #define Edit_unit 88 ! 135: #define Edit_target 89 ! 136: #define Colon 90 ! 137: #define Equals 91 ! 138: #define Test_suite 92 ! 139: #define Expression 93 ! 140: ! 141: /* ! 142: * The last three, `Suggestion', `Optional' and `Hole', ! 143: * with values 97, 98 and 99, are defined in "gram.h". ! 144: */ ! 145: ! 146: ! 147: /* ! 148: * Symbol values used for lexical elements. ! 149: * Cross-reference: "lexi.c", table `chclass'. ! 150: */ ! 151: ! 152: #define LEXICAL 100 ! 153: ! 154: #define IDENT (LEXICAL+0) ! 155: #define KEYWORD (LEXICAL+1) ! 156: #define NUMBER (LEXICAL+2) ! 157: #define COMMENT (LEXICAL+3) ! 158: #define TEXT1 (LEXICAL+4) ! 159: #define TEXT2 (LEXICAL+5) ! 160: #define OPERATORS (LEXICAL+6) ! 161: #define RAWINPUT (LEXICAL+7) ! 162: #define SUGGESTION (LEXICAL+8) ! 163: ! 164: ! 165: /* ! 166: * Classes used in table initialization. ! 167: */ ! 168: ! 169: Hidden classelem Asugg_body[] = {SUGGESTION, 0}; ! 170: Hidden struct classinfo sugg_body[] = {Asugg_body}; ! 171: ! 172: #define TARGET Tag, Com_target, Selection, Behead, Curtail ! 173: #define PRIMARY \ ! 174: Sel_expr, Tag, E_number, Number, Compound, L_t_dis, Text1, Text2 ! 175: #define EXPR Blocked, Grouped, Operators, PRIMARY ! 176: ! 177: Hidden classelem Atag_body[] = {IDENT, 0}; ! 178: Hidden struct classinfo tag_body[] = {Atag_body}; ! 179: Hidden classelem Anum_body[] = {NUMBER, 0}; ! 180: Hidden struct classinfo num_body[] = {Anum_body}; ! 181: Hidden classelem Acom_body[] = {COMMENT, 0}; ! 182: Hidden struct classinfo com_body[] = {Acom_body}; ! 183: Hidden classelem Akw_body[] = {KEYWORD, 0}; ! 184: Hidden struct classinfo kw_body[] = {Akw_body}; ! 185: Hidden classelem At1_body[] = {TEXT1, 0}; ! 186: Hidden struct classinfo t1_body[] = {At1_body}; ! 187: Hidden classelem At2_body[] = {TEXT2, 0}; ! 188: Hidden struct classinfo t2_body[] = {At2_body}; ! 189: Hidden classelem Aops_body[] = {OPERATORS, 0}; ! 190: Hidden struct classinfo ops_body[] = {Aops_body}; ! 191: Hidden classelem Araw_body[] = {RAWINPUT, 0}; ! 192: Hidden struct classinfo raw_body[] = {Araw_body}; ! 193: Hidden classelem Araw_input[] = {Optional, Raw, 0}; ! 194: Hidden struct classinfo raw_input[] = {Araw_input}; ! 195: ! 196: Hidden classelem Aid_or_kw[] = {Tag, Keyword, 0}; ! 197: Hidden struct classinfo id_or_kw[] = {Aid_or_kw}; ! 198: Hidden classelem Anumber[] = {Number, 0}; ! 199: Hidden struct classinfo number[] = {Anumber}; ! 200: Hidden classelem Asign[] = {Optional, Plus_sign, Minus_sign, 0}; ! 201: Hidden struct classinfo sign[] = {Asign}; ! 202: ! 203: Hidden classelem Ao_c_expr[] = {Optional, Collateral, EXPR, 0}; ! 204: Hidden struct classinfo o_c_expr[] = {Ao_c_expr}; ! 205: ! 206: #define Ac_expr (Ao_c_expr+1) ! 207: Hidden struct classinfo c_expr[] = {Ac_expr}; ! 208: #define Aexpr (Ao_c_expr+2) ! 209: Hidden struct classinfo expr[] = {Aexpr}; ! 210: #define Aprimary (Ao_c_expr+5) ! 211: Hidden struct classinfo primary[] = {Aprimary}; ! 212: ! 213: Hidden classelem Ablock[] = {Operators, PRIMARY, 0}; ! 214: Hidden struct classinfo block[] = {Ablock}; ! 215: Hidden classelem Agroup[] = {Blocked, Operators, PRIMARY, 0}; ! 216: Hidden struct classinfo group[] = {Agroup}; ! 217: ! 218: #define Ar_expr Agroup ! 219: Hidden struct classinfo r_expr[] = {Ar_expr}; ! 220: ! 221: Hidden classelem Al_t_body[] = {Optional, List_body, PRIMARY, Blocked, ! 222: Grouped, Operators, Tab_body, Tab_entry, 0}; ! 223: Hidden struct classinfo l_t_body[] = {Al_t_body}; ! 224: Hidden classelem Alist_body[] = {List_body, EXPR, 0}; ! 225: Hidden struct classinfo list_body[] = {Alist_body}; ! 226: Hidden classelem Atab_body[] = {Tab_body, Tab_entry, 0}; ! 227: Hidden struct classinfo tab_body[] = {Atab_body}; ! 228: Hidden classelem Atab_entry[] = {Tab_entry, 0}; ! 229: Hidden struct classinfo tab_entry[] = {Atab_entry}; ! 230: ! 231: Hidden classelem Ac_target[] = {Col_target, TARGET, 0}; ! 232: Hidden struct classinfo c_target[] = {Ac_target}; ! 233: ! 234: #define Atarget (Ac_target+1) ! 235: Hidden struct classinfo target[] = {Atarget}; ! 236: ! 237: #define SOME_ETC \ ! 238: Not, Some_in, Each_in, No_in, Some_parsing, Each_parsing, No_parsing ! 239: ! 240: Hidden classelem Ae_test[] = {Else_kw, SOME_ETC, And, Or, EXPR, 0}; ! 241: Hidden struct classinfo e_test[] = {Ae_test}; ! 242: ! 243: #define Atest (Ae_test+1) ! 244: Hidden struct classinfo test[] = {Atest}; ! 245: #define At_test Aexpr ! 246: Hidden struct classinfo t_test[] = {At_test}; ! 247: Hidden classelem Ar_test[] = {SOME_ETC, EXPR, 0}; ! 248: Hidden struct classinfo r_test[] = {Ar_test}; ! 249: Hidden classelem Aand_test[] = {SOME_ETC, And, EXPR, 0}; ! 250: Hidden struct classinfo and_test[] = {Aand_test}; ! 251: Hidden classelem Aor_test[] = {SOME_ETC, Or, EXPR, 0}; ! 252: Hidden struct classinfo or_test[] = {Aor_test}; ! 253: Hidden classelem Ac_test[] = {Collateral, SOME_ETC, And, Or, EXPR, 0}; ! 254: Hidden struct classinfo c_test[] = {Ac_test}; ! 255: /* ! 256: * This means that a compound expression may in fact ! 257: * contain a `collateral test', e.g. (a AND b, c AND d). ! 258: * Of course, this is illegal in B, but I couldn't ! 259: * solve the ambiguity of `(' where a test is expected ! 260: * otherwise (this may start a parenthesized test, or ! 261: * a compound expression; the latter may be followed ! 262: * by more expression fragments, the first may not). ! 263: */ ! 264: ! 265: Hidden classelem Acomment[] = {Comment, 0}; ! 266: Hidden struct classinfo comment[] = {Acomment}; ! 267: Hidden classelem Ao_comment[] = {Optional, Comment, 0}; ! 268: Hidden struct classinfo o_comment[] = {Ao_comment}; ! 269: ! 270: #define HEAD How_to, Yield, Test ! 271: #define BODY HEAD, Cmt_head, Long_unit, Short_unit ! 272: ! 273: /* The order here determines which are suggested first and is subject ! 274: to constant change! */ ! 275: #define SIMPLE_CMD SC1, SC2, SC3 ! 276: #define SC1 Share, Quit, Return, Write, Read, Read_raw, Put, Delete ! 277: #define SC2 Report, Fail, Succeed, Insert, Remove, Check ! 278: #define SC3 Choose, Draw, Set_random, Suggestion, Keyword, Kw_plus ! 279: ! 280: #define CONTROL_CMD If, While, For ! 281: #define COMP_CMD Short_comp, Long_comp, Cmt_comp, Select ! 282: #define CMD If, For, COMP_CMD, SIMPLE_CMD, While ! 283: /* #define SHORTCMD SIMPLE_CMD, Cmt_cmd */ ! 284: #define SHORTCMD If, For, SIMPLE_CMD, While, Short_comp, Cmt_comp, Cmt_cmd ! 285: ! 286: Hidden classelem Ac_head[] = {Cmt_head, HEAD, 0}; ! 287: Hidden struct classinfo c_head[] = {Ac_head}; ! 288: #define Ahead (Ac_head+1) ! 289: Hidden struct classinfo head[] = {Ahead}; ! 290: ! 291: Hidden classelem Aunit[] = {Optional, EXPR, BODY, Ref_join, 0}; ! 292: Hidden struct classinfo unit[] = {Aunit}; ! 293: Hidden classelem Ao_refinements[] = {Optional, Refinement, 0}; ! 294: Hidden struct classinfo o_refinements[] = {Ao_refinements}; ! 295: #define Arefinements (Ao_refinements+1) ! 296: Hidden struct classinfo refinements[] = {Arefinements}; ! 297: Hidden classelem Arefpred[] = {BODY, 0}; ! 298: Hidden struct classinfo refpred[] = {Arefpred}; ! 299: ! 300: Hidden classelem Af_cmd[] = {Keyword, F_kw_plus, 0}; ! 301: Hidden struct classinfo f_cmd[] = {Af_cmd}; ! 302: #define Af_formula Aexpr /*****/ ! 303: Hidden struct classinfo f_formula[] = {Af_formula}; ! 304: ! 305: Hidden classelem Ao_suite[] = {Optional, Suite, 0}; ! 306: Hidden struct classinfo o_suite[] = {Ao_suite}; ! 307: Hidden classelem At_suite[] = {Test_suite, 0}; ! 308: Hidden struct classinfo t_suite[] = {At_suite}; ! 309: Hidden classelem Ao_t_suite[] = {Optional, Test_suite, 0}; ! 310: Hidden struct classinfo o_t_suite[] = {Ao_t_suite}; ! 311: ! 312: Hidden classelem Acmd[] = {Comment, CMD, Cmt_cmd, 0}; ! 313: Hidden struct classinfo cmd[] = {Acmd}; ! 314: Hidden classelem Ashortcmd[] = {SHORTCMD, 0}; ! 315: Hidden struct classinfo shortcmd[] = {Ashortcmd}; ! 316: Hidden classelem Ao_cmdsuite[] = {Optional, SHORTCMD, Suite, 0}; ! 317: Hidden struct classinfo o_cmdsuite[] = {Ao_cmdsuite}; ! 318: Hidden classelem Asuite[] = {Suite, 0}; ! 319: Hidden struct classinfo suite[] = {Asuite}; ! 320: Hidden classelem Asimple_cmd[] = {SIMPLE_CMD, 0}; ! 321: Hidden struct classinfo simple_cmd[] = {Asimple_cmd}; ! 322: ! 323: Hidden classelem Ac_ifforwhile[] = {CONTROL_CMD, Cmt_comp, 0}; ! 324: Hidden struct classinfo c_ifforwhile[] = {Ac_ifforwhile}; ! 325: Hidden classelem Aifforwhile[] = {CONTROL_CMD, 0}; ! 326: Hidden struct classinfo ifforwhile[] = {Aifforwhile}; ! 327: ! 328: Hidden classelem Akeyword[] = {Keyword, 0}; ! 329: Hidden struct classinfo keyword[] = {Akeyword}; ! 330: Hidden classelem Akw_next[] = {Collateral, EXPR, Keyword, E_plus, Kw_plus, 0}; ! 331: Hidden struct classinfo kw_next[] = {Akw_next}; ! 332: Hidden classelem Ae_next[] = {Keyword, Kw_plus, 0}; ! 333: Hidden struct classinfo e_next[] = {Ae_next}; ! 334: ! 335: Hidden classelem Af_kw_next[] = {Tag, Keyword, F_kw_plus, F_e_plus, 0}; ! 336: Hidden struct classinfo f_kw_next[] = {Af_kw_next}; ! 337: Hidden classelem Af_e_next[] = {Keyword, F_kw_plus, 0}; ! 338: Hidden struct classinfo f_e_next[] = {Af_e_next}; ! 339: Hidden classelem Atag[] = {Tag, 0}; ! 340: Hidden struct classinfo tag[] = {Atag}; ! 341: ! 342: Hidden classelem Atext1[] = {Optional, T1, Conversion, T1_plus, 0}; ! 343: Hidden struct classinfo text1[] = {Atext1}; ! 344: Hidden classelem At1_conv[] = {T1, Conversion, 0}; ! 345: Hidden struct classinfo t1_conv[] = {At1_conv}; ! 346: Hidden classelem At1_next[] = {T1, Conversion, T1_plus, 0}; ! 347: Hidden struct classinfo t1_next[] = {At1_next}; ! 348: ! 349: Hidden classelem Atext2[] = {Optional, T2, Conversion, T2_plus, 0}; ! 350: Hidden struct classinfo text2[] = {Atext2}; ! 351: Hidden classelem At2_conv[] = {T2, Conversion, 0}; ! 352: Hidden struct classinfo t2_conv[] = {At2_conv}; ! 353: Hidden classelem At2_next[] = {T2, Conversion, T2_plus, 0}; ! 354: Hidden struct classinfo t2_next[] = {At2_next}; ! 355: ! 356: Hidden classelem Aand[] = {And_kw, 0}; ! 357: Hidden struct classinfo and[] = {Aand}; ! 358: Hidden classelem Aor[] = {Or_kw, 0}; ! 359: Hidden struct classinfo or[] = {Aor}; ! 360: ! 361: Hidden classelem Ae_part[] = {E_part, 0}; ! 362: Hidden struct classinfo e_part[] = {Ae_part}; ! 363: ! 364: Hidden classelem Aunit_edit[] = {Optional, BODY, Ref_join, 0}; ! 365: Hidden struct classinfo unit_edit[] = {Aunit_edit}; ! 366: Hidden classelem Atarget_edit[] = {Optional, EXPR, 0}; ! 367: Hidden struct classinfo target_edit[] = {Atarget_edit}; ! 368: Hidden classelem Aimm_cmd[] = {Optional, Comment, HEAD, CMD, Cmt_cmd, Cmt_head, ! 369: Edit_unit, Edit_target, 0}; ! 370: Hidden struct classinfo imm_cmd[] = {Aimm_cmd}; ! 371: ! 372: Hidden classelem Aed_unit[] = {Optional, Tag, Keyword, Colon, 0}; ! 373: Hidden struct classinfo ed_unit[] = {Aed_unit}; ! 374: Hidden classelem Aed_target[] = {Optional, Tag, Equals, 0}; ! 375: Hidden struct classinfo ed_target[] = {Aed_target}; ! 376: ! 377: ! 378: /* ! 379: * WARNING: The entries in this table must correspond one by one ! 380: * to the symbols defined earlier. This is checked dynamically ! 381: * by the initialization procedure (syserr "table order"). ! 382: */ ! 383: ! 384: #define XX(name) name, "name" ! 385: ! 386: Hidden struct table b_grammar[] = { ! 387: {XX(Rootsymbol), {0}, {unit}}, /* Start symbol of the grammar, ! 388: may be overridden by setroot("Blabla") call. */ ! 389: {XX(Put), {"PUT ", " IN "}, {c_expr, c_target}}, ! 390: {XX(Insert), {"INSERT ", " IN "}, {c_expr, target}}, ! 391: {XX(Remove), {"REMOVE ", " FROM "}, {c_expr, target}}, ! 392: {XX(Choose), {"CHOOSE ", " FROM "}, {c_expr, expr}}, ! 393: {XX(Draw), {"DRAW "}, {target}}, ! 394: {XX(Set_random), {"SET'RANDOM "}, {c_expr}}, ! 395: {XX(Delete), {"DELETE "}, {c_target}}, ! 396: {XX(Check), {"CHECK "}, {test}}, ! 397: {XX(Share), {"SHARE "}, {c_target}}, ! 398: ! 399: {XX(Write), {"WRITE "}, {c_expr}}, ! 400: {XX(Read), {"READ ", " EG "}, {c_target, c_expr}}, ! 401: {XX(Read_raw), {"READ ", " RAW"}, {target}}, ! 402: ! 403: {XX(If), {"IF ", ": "}, {test}}, ! 404: {XX(While), {"WHILE ", ": "}, {test}}, ! 405: {XX(For), {"FOR ", " IN ", ": "}, {c_target, expr}}, ! 406: ! 407: {XX(Select), {"SELECT: ", "\t", "\b"}, {o_comment, t_suite}}, ! 408: {0}, /* Test_suite moved to 92 */ ! 409: ! 410: {XX(Quit), {"QUIT"}, {0}}, ! 411: {XX(Return), {"RETURN "}, {c_expr}}, ! 412: {XX(Report), {"REPORT "}, {test}}, ! 413: {XX(Succeed), {"SUCCEED"}, {0}}, ! 414: {XX(Fail), {"FAIL"}, {0}}, ! 415: ! 416: {XX(How_to), {"HOW'TO ", ": "}, {f_cmd}}, ! 417: {XX(Yield), {"YIELD ", ": "}, {f_formula}}, ! 418: {XX(Test), {"TEST ", ": "}, {f_formula}}, ! 419: ! 420: {XX(Suite), {"\n"}, {cmd, o_suite}}, ! 421: {XX(Refinement), {"\n", ": ", "\t", "\b"}, ! 422: {id_or_kw, o_comment, o_cmdsuite, o_refinements}}, ! 423: ! 424: {XX(Compound), {"(", ")"}, {c_test}}, ! 425: {XX(Collateral), {0, ", "}, {expr, c_expr}}, ! 426: {XX(Tag), {0}, {tag_body}}, ! 427: {XX(Number), {0}, {num_body}}, ! 428: {XX(Selection), {0, "[", "]"}, {target, c_expr}}, ! 429: {XX(Behead), {0, "@"}, {target, r_expr}}, ! 430: {XX(Curtail), {0, "|"}, {target, r_expr}}, ! 431: ! 432: {XX(And), {0, " "}, {t_test, and}}, ! 433: {XX(Or), {0, " "}, {t_test, or}}, ! 434: {XX(Not), {"NOT "}, {r_test}}, ! 435: {XX(Some_in), {"SOME ", " IN ", " HAS "}, {c_target, expr, r_test}}, ! 436: {XX(Each_in), {"EACH ", " IN ", " HAS "}, {c_target, expr, r_test}}, ! 437: {XX(No_in), {"NO ", " IN ", " HAS "}, {c_target, expr, r_test}}, ! 438: {XX(Some_parsing), {"SOME ", " PARSING ", " HAS "}, ! 439: {c_target, expr, r_test}}, ! 440: {XX(Each_parsing), {"EACH ", " PARSING ", " HAS "}, ! 441: {c_target, expr, r_test}}, ! 442: {XX(No_parsing), {"NO ", " PARSING ", " HAS "}, {c_target, expr, r_test}}, ! 443: ! 444: {XX(Comment), {0}, {com_body}}, ! 445: {XX(Keyword), {0}, {kw_body}}, ! 446: ! 447: {XX(L_t_dis), {"{", "}"}, {l_t_body}}, ! 448: {XX(List_body), {0, "; "}, {expr, list_body}}, ! 449: {XX(Tab_body), {0, "; "}, {tab_entry, tab_body}}, ! 450: {XX(Tab_entry), {"[", "]: "}, {c_expr, expr}}, ! 451: {XX(E_number), {0}, {number, e_part}}, ! 452: ! 453: {XX(Com_target), {"(", ")"}, {c_target}}, ! 454: {XX(Col_target), {0, ", "}, {target, c_target}}, ! 455: {XX(Sel_expr), {0, "[", "]"}, {primary, c_expr}}, ! 456: ! 457: {XX(Text1), {"'", "'"}, {text1}}, ! 458: {XX(Text2), {"\"", "\""}, {text2}}, ! 459: {XX(Grouped), {0, " "}, {group, expr}}, ! 460: {XX(Blocked), {0}, {block, group}}, ! 461: {XX(Operators), {0}, {ops_body}}, ! 462: {XX(Else_kw), {"ELSE"}, {0}}, ! 463: {XX(Kw_plus), {0, " "}, {keyword, kw_next}}, ! 464: {XX(E_plus), {0, " "}, {c_expr, e_next}}, ! 465: {XX(Conversion), {"`", "`"}, {o_c_expr}}, ! 466: {XX(T1), {0}, {t1_body}}, ! 467: {XX(T1_plus), {0}, {t1_conv, t1_next}}, ! 468: {XX(T2), {0}, {t2_body}}, ! 469: {XX(T2_plus), {0}, {t2_conv, t2_next}}, ! 470: {XX(Cmt_cmd), {0, " "}, {simple_cmd, comment}}, ! 471: {0}, ! 472: {XX(F_kw_plus), {0, " "}, {keyword, f_kw_next}}, ! 473: {XX(F_e_plus), {0, " "}, {tag, f_e_next}}, ! 474: {XX(Plus_sign), {"+"}, {0}}, ! 475: {XX(Minus_sign), {"-"}, {0}}, ! 476: ! 477: {XX(Long_comp), {0, "\t", "\b"}, {c_ifforwhile, suite}}, ! 478: {XX(Short_comp), {0, "\t", "\b"}, {ifforwhile, shortcmd}}, ! 479: {XX(Cmt_comp), {0}, {ifforwhile, comment}}, ! 480: ! 481: {XX(Long_unit), {0, "\t", "\b"}, {c_head, suite}}, ! 482: {XX(Short_unit), {0, "\t", "\b"}, {head, shortcmd}}, ! 483: {XX(Cmt_head), {0}, {head, comment}}, ! 484: ! 485: {XX(Ref_join), {0}, {refpred, refinements}}, ! 486: ! 487: {XX(And_kw), {"AND "}, {and_test}}, ! 488: {XX(Or_kw), {"OR "}, {or_test}}, ! 489: ! 490: {XX(E_part), {"E"}, {sign, number}}, ! 491: ! 492: /* Alternate root symbols */ ! 493: ! 494: {XX(Unit_edit), {0}, {unit_edit}}, ! 495: {XX(Target_edit), {0}, {target_edit}}, ! 496: {XX(Imm_cmd), {0}, {imm_cmd}}, ! 497: {XX(Raw), {0}, {raw_body}}, ! 498: {XX(Raw_input), {0}, {raw_input}}, ! 499: {XX(Edit_unit), {":"}, {ed_unit}}, ! 500: {XX(Edit_target), {"="}, {ed_target}}, ! 501: {XX(Colon), {":"}, {0}}, ! 502: {XX(Equals), {"="}, {0}}, ! 503: {XX(Test_suite), {"\n", ": ", "\t", "\b"}, ! 504: {e_test, o_comment, o_cmdsuite, o_t_suite}}, ! 505: {XX(Expression), {0}, {c_expr}}, ! 506: ! 507: /* Spare(s); change Optional and Hole in "gram.h" if you run out. */ ! 508: ! 509: {0}, {0}, {0}, ! 510: ! 511: /* Next three entries must be the last entries of the table. */ ! 512: /* (See comments in "gram.c", initgram().) */ ! 513: ! 514: {XX(Suggestion), {0}, {sugg_body}}, ! 515: {XX(Optional), {0}, {0}}, ! 516: {XX(Hole), {"?"}, {0}}, ! 517: }; ! 518: ! 519: Visible struct table *table= b_grammar;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.