⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 existing.at

📁 GNU的词法/语法分析器bison源码
💻 AT
📖 第 1 页 / 共 5 页
字号:
# 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 + -