📄 existing.at
字号:
# Exercising Bison on actual grammars. -*- Autotest -*-# Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004# Free Software Foundation, Inc.# This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2, or (at your option)# any later version.# This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.# You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA# 02110-1301, USA.AT_BANNER([[Existing Grammars.]])## ----------------- #### GNU AWK Grammar. #### ----------------- ##AT_SETUP([GNU AWK Grammar])# We have been careful to strip all the actions excepts the# mid-rule actions. We rely on %expect to check that there are# indeed 65 SR conflicts.## Bison was once wrong, due to an incorrect computation of nullable.# It reported 485 SR conflicts!AT_DATA([[input.y]],[[%expect 65%token FUNC_CALL NAME REGEXP%token ERROR%token YNUMBER YSTRING%token RELOP APPEND_OP%token ASSIGNOP MATCHOP NEWLINE CONCAT_OP%token LEX_BEGIN LEX_END LEX_IF LEX_ELSE LEX_RETURN LEX_DELETE%token LEX_WHILE LEX_DO LEX_FOR LEX_BREAK LEX_CONTINUE%token LEX_PRINT LEX_PRINTF LEX_NEXT LEX_EXIT LEX_FUNCTION%token LEX_GETLINE LEX_NEXTFILE%token LEX_IN%token LEX_AND LEX_OR INCREMENT DECREMENT%token LEX_BUILTIN LEX_LENGTH/* Lowest to highest */%right ASSIGNOP%right '?' ':'%left LEX_OR%left LEX_AND%left LEX_GETLINE%nonassoc LEX_IN%left FUNC_CALL LEX_BUILTIN LEX_LENGTH%nonassoc ','%nonassoc MATCHOP%nonassoc RELOP '<' '>' '|' APPEND_OP TWOWAYIO%left CONCAT_OP%left YSTRING YNUMBER%left '+' '-'%left '*' '/' '%'%right '!' UNARY%right '^'%left INCREMENT DECREMENT%left '$'%left '(' ')'%%start : opt_nls program opt_nls ;program : rule | program rule | error | program error | /* empty */ ;rule : LEX_BEGIN {} action | LEX_END {} action | LEX_BEGIN statement_term | LEX_END statement_term | pattern action | action | pattern statement_term | function_prologue function_body ;func_name : NAME | FUNC_CALL | lex_builtin ;lex_builtin : LEX_BUILTIN | LEX_LENGTH ;function_prologue : LEX_FUNCTION {} func_name '(' opt_param_list r_paren opt_nls ;function_body : l_brace statements r_brace opt_semi opt_nls | l_brace r_brace opt_semi opt_nls ;pattern : exp | exp ',' exp ;regexp /* * In this rule, want_regexp tells yylex that the next thing * is a regexp so it should read up to the closing slash. */ : '/' {} REGEXP '/' ;action : l_brace statements r_brace opt_semi opt_nls | l_brace r_brace opt_semi opt_nls ;statements : statement | statements statement | error | statements error ;statement_term : nls | semi opt_nls ;statement : semi opt_nls | l_brace r_brace | l_brace statements r_brace | if_statement | LEX_WHILE '(' exp r_paren opt_nls statement | LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls | LEX_FOR '(' NAME LEX_IN NAME r_paren opt_nls statement | LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement | LEX_FOR '(' opt_exp semi opt_nls semi opt_nls opt_exp r_paren opt_nls statement | LEX_BREAK statement_term | LEX_CONTINUE statement_term | print '(' expression_list r_paren output_redir statement_term | print opt_rexpression_list output_redir statement_term | LEX_NEXT statement_term | LEX_NEXTFILE statement_term | LEX_EXIT opt_exp statement_term | LEX_RETURN {} opt_exp statement_term | LEX_DELETE NAME '[' expression_list ']' statement_term | LEX_DELETE NAME statement_term | exp statement_term ;print : LEX_PRINT | LEX_PRINTF ;if_statement : LEX_IF '(' exp r_paren opt_nls statement | LEX_IF '(' exp r_paren opt_nls statement LEX_ELSE opt_nls statement ;nls : NEWLINE | nls NEWLINE ;opt_nls : /* empty */ | nls ;input_redir : /* empty */ | '<' simp_exp ;output_redir : /* empty */ | '>' exp | APPEND_OP exp | '|' exp | TWOWAYIO exp ;opt_param_list : /* empty */ | param_list ;param_list : NAME | param_list comma NAME | error | param_list error | param_list comma error ;/* optional expression, as in for loop */opt_exp : /* empty */ | exp ;opt_rexpression_list : /* empty */ | rexpression_list ;rexpression_list : rexp | rexpression_list comma rexp | error | rexpression_list error | rexpression_list error rexp | rexpression_list comma error ;opt_expression_list : /* empty */ | expression_list ;expression_list : exp | expression_list comma exp | error | expression_list error | expression_list error exp | expression_list comma error ;/* Expressions, not including the comma operator. */exp : variable ASSIGNOP {} exp | '(' expression_list r_paren LEX_IN NAME | exp '|' LEX_GETLINE opt_variable | exp TWOWAYIO LEX_GETLINE opt_variable | LEX_GETLINE opt_variable input_redir | exp LEX_AND exp | exp LEX_OR exp | exp MATCHOP exp | regexp | '!' regexp %prec UNARY | exp LEX_IN NAME | exp RELOP exp | exp '<' exp | exp '>' exp | exp '?' exp ':' exp | simp_exp | exp simp_exp %prec CONCAT_OP ;rexp : variable ASSIGNOP {} rexp | rexp LEX_AND rexp | rexp LEX_OR rexp | LEX_GETLINE opt_variable input_redir | regexp | '!' regexp %prec UNARY | rexp MATCHOP rexp | rexp LEX_IN NAME | rexp RELOP rexp | rexp '?' rexp ':' rexp | simp_exp | rexp simp_exp %prec CONCAT_OP ;simp_exp : non_post_simp_exp /* Binary operators in order of decreasing precedence. */ | simp_exp '^' simp_exp | simp_exp '*' simp_exp | simp_exp '/' simp_exp | simp_exp '%' simp_exp | simp_exp '+' simp_exp | simp_exp '-' simp_exp | variable INCREMENT | variable DECREMENT ;non_post_simp_exp : '!' simp_exp %prec UNARY | '(' exp r_paren | LEX_BUILTIN '(' opt_expression_list r_paren | LEX_LENGTH '(' opt_expression_list r_paren | LEX_LENGTH | FUNC_CALL '(' opt_expression_list r_paren | variable | INCREMENT variable | DECREMENT variable | YNUMBER | YSTRING | '-' simp_exp %prec UNARY | '+' simp_exp %prec UNARY ;opt_variable : /* empty */ | variable ;variable : NAME | NAME '[' expression_list ']' | '$' non_post_simp_exp ;l_brace : '{' opt_nls ;r_brace : '}' opt_nls ;r_paren : ')' ;opt_semi : /* empty */ | semi ;semi : ';' ;comma : ',' opt_nls ;%%]])# Pass plenty of options, to exercise plenty of code, even if we# don't actually check the output. But SEGV is watching us, and# so might do dmalloc.AT_CHECK([[bison --verbose --defines input.y]])AT_CLEANUP## ----------------- #### GNU Cim Grammar. #### ----------------- ##AT_SETUP([GNU Cim Grammar])# GNU Cim, the GNU Simula 87 Compiler.# Bison was once wrong, due to an incorrect computation of the RR conflicts.# It reported 80 SR && 99 RR conflicts instead of 78/10!!!AT_DATA([[input.y]],[[%union { long int token; long int ival; long int arrdim; double rval; char *ident; char *tval; char stat_decl; }%token HACTIVATE HAFTER /*HAND*/ HARRAY HAT HBEFORE HBEGIN HBOOLEAN HCHARACTER HCLASS /*HCOMMENT*/ HCONC HDELAY HDO HELSE HEND HEQ /*HEQV*/ HEXTERNAL HFOR HGE HGO HGOTO HGT HHIDDEN HIF /*HIMP*/ HIN HINNER HINSPECT HINTEGER HIS HLABEL HLE HLONG HLT HNAME HNE HNEW HNONE /*HNOT*/ HNOTEXT /*HOR*/ HOTHERWISE HPRIOR HPROCEDURE HPROTECTED HQUA HREACTIVATE HREAL HREF HSHORT HSTEP HSWITCH HTEXT HTHEN HTHIS HTO HUNTIL HVALUE HVAR HVIRTUAL HWHEN HWHILE HASSIGNVALUE HASSIGNREF /*HDOT*/ HPAREXPSEPARATOR HLABELSEPARATOR HSTATEMENTSEPARATOR HBEGPAR HENDPAR HEQR HNER HADD HSUB HMUL HDIV HINTDIV HEXP HDOTDOTDOT%token <ident> HIDENTIFIER%token <ival> HBOOLEANKONST HINTEGERKONST HCHARACTERKONST%token <rval> HREALKONST%token <tval> HTEXTKONST%type <tval> EXT_IDENT%type <stat_decl> DECLSTATEMENT MODULSTATEMENT MBEE_DECLSTMS MBEE_DECLSTMSU%type <stat_decl> MODULS%type <ident> EXPRESSION_SIMP MBEE_ARG_R_PT%type <arrdim> BAUND_PAIR_LIST%right <token> HASSIGN%left HORELSE%left HANDTHEN%left HEQV%left HIMP%left HOR%left HAND%left HNOT%left <token> HVALRELOPERATOR HREFRELOPERATOR HOBJRELOPERATOR%left HCONC%left <token> HTERMOPERATOR%left <token> UNEAR%left <token> HFACTOROPERATOR%left HPRIMARYOPERATOR%left HQUA%left HDOT%start MAIN_MODULE%%/* GRAMATIKK FOR PROGRAM MODULES */MAIN_MODULE : { categ=CLOCAL; mout(MBLOCK); beginBlock(KBLOKK);separat_comp=FALSE;} MODULS { endBlock(NULL,CCNO); mout(MENDBLOCK);} | error HSTATEMENTSEPARATOR MBEE_DECLSTMS ;EXT_DECLARATION : HEXTERNAL MBEE_TYPE HPROCEDURE { MBEENEWBLOCK(); kind=KPROC;} EXT_LIST | HEXTERNAL HIDENTIFIER HPROCEDURE { MBEENEWBLOCK(); type=TNOTY; kind=KPROC; if($2==Ckind)categ=CCPROC;else yerror (1); ysensitive=sensitive; sensitive=ON;} HIDENTIFIER { $<ident>$=$5; sensitive=ysensitive;} EXTERNAL_KIND_ITEM { categ=CLOCAL;} | HEXTERNAL HCLASS { MBEENEWBLOCK(); kind=KCLASS;} EXT_LIST ;EXTERNAL_KIND_ITEM: EXT_IDENT HOBJRELOPERATOR { if($2!=HIS)yerror (2);} MBEE_TYPE HPROCEDURE HIDENTIFIER { regDecl($6, type, KPROC, CCPROC); beginBlock(kind);} HEADING EMPTY_BLOCK { categ=CLOCAL; endBlock($1==NULL?$<ident>0:tag($1),CCCPROC);}/* | EXT_IDENT { if($1!=NULL)yerror (3); regDecl($0, type, kind, categ);} MBEE_REST_EXT_LIST { endBlock(NULL,CCNO);} ;MBEE_REST_EXT_LIST: /* EMPTY | HPAREXPSEPARATOR EXT_KIND_LIST ;EXT_KIND_LIST : EXT_KIND_ITEM | EXT_KIND_LIST HPAREXPSEPARATOR EXT_KIND_ITEM ;EXT_KIND_ITEM : HIDENTIFIER EXT_IDENT { if($2!=NULL)yerror (3); regDecl($1, type, kind, categ);}*/ ;EMPTY_BLOCK : /*EMPT*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -