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

📄 cxx-type.at

📁 bison 2.0 主要可以用来做语法分析用的
💻 AT
字号:
# Checking GLR Parsing.                         -*- Autotest -*-# Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA# 02111-1307, USA.AT_BANNER([[C++ Type Syntax (GLR).]])# _AT_TEST_GLR_CXXTYPES(DECL, RESOLVE1, RESOLVE2)# -----------------------------------------------# Store into types.y the calc program, with DECL inserted as a declaration,# and with RESOLVE1 and RESOLVE2 as annotations on the conflicted rule for# stmt.  Then compile the result.m4_define([_AT_TEST_GLR_CXXTYPES],[AT_BISON_OPTION_PUSHDEFS([$1])AT_DATA_GRAMMAR([types.y],[[/* Simplified C++ Type and Expression Grammar.  */$1%{  #include <stdio.h>  #define YYSTYPE char const *]m4_bmatch([$2], [stmtMerge],[ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[  #define YYINITDEPTH 10  static char *format (char const *, ...);  struct YYLTYPE;#if YYPURE# if YYLSP_NEEDED#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s# else#  define LEX_PARAMETERS YYSTYPE *lvalp# endif#endif#ifndef LEX_PARAMETERS# define LEX_PARAMETERS void#endif#ifndef ERROR_PARAMETERS# define ERROR_PARAMETERS char const *s#endif  int yylex (LEX_PARAMETERS);  int yyerror (ERROR_PARAMETERS);%}%token TYPENAME ID%right '='%left '+'%glr-parser%%prog :     | prog stmt   {]AT_LOCATION_IF([			printf ("%d.%d-%d.%d: ",			     @2.first_line, @2.first_column,			     @2.last_line, @2.last_column);])[			printf ("%s\n", ]$[2);		   }     ;stmt : expr ';'  $2	{ $$ = ]$[1; }     | decl      $3     | error ';'	{ $$ = "<error>"; }     | '@'  		{ YYACCEPT; }     ;expr : ID     | TYPENAME '(' expr ')'  { $$ = format ("<cast>(%s,%s)", ]$[3, ]$[1); }     | expr '+' expr	      { $$ = format ("+(%s,%s)", ]$[1, ]$[3); }     | expr '=' expr          { $$ = format ("=(%s,%s)", ]$[1, ]$[3); }     ;decl : TYPENAME declarator ';'			{ $$ = format ("<declare>(%s,%s)", ]$[1, ]$[2); }     | TYPENAME declarator '=' expr ';'			{ $$ = format ("<init-declare>(%s,%s,%s)", ]$[1, ]$[2, ]$[4); }     ;declarator : ID     | '(' declarator ')' { $$ = ]$[2; }     ;%%#include <ctype.h>#include <stdlib.h>#include <string.h>#include <stdarg.h>intmain (int argc, char **argv){  if (argc != 2)    abort ();  if (!freopen (argv[1], "r", stdin))    abort ();  exit (yyparse ());}intyylex (LEX_PARAMETERS){  char buffer[256];  int c;  unsigned int i;  static int lineNum = 1;  static int colNum = 0;#if YYPURE# define yylloc (*llocp)# define yylval (*lvalp)#endif  while (1)    {      c = getchar ();      switch (c)	{	case EOF:	  return 0;	case '\t':	  colNum = (colNum + 7) & ~7;	  break;	case ' ': case '\f':	  colNum += 1; 	  break;	case '\n':	  lineNum += 1;	  colNum = 0;	  break;	default:	  {	    int tok;#if YYLSP_NEEDED	    yylloc.first_line = yylloc.last_line = lineNum;	    yylloc.first_column = colNum;#endif	    if (isalpha (c))	      {		i = 0;		do		  {		    buffer[i++] = c;		    colNum += 1;		    if (i == sizeof buffer - 1)		      abort ();		    c = getchar ();		  }		while (isalnum (c) || c == '_');		ungetc (c, stdin);		buffer[i++] = 0;		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;		yylval = strcpy (malloc (i), buffer);	      }	    else	      {		colNum += 1;		tok = c;		yylval = "";	      }#if YYLSP_NEEDED	    yylloc.last_column = colNum-1;#endif	    return tok;	  }	}    }}intyyerror (ERROR_PARAMETERS){#if YYPURE && YYLSP_NEEDED  /* Pacify GCC by using llocp.  */  if (! llocp)    abort ();#endif  fprintf (stderr, "%s\n", s);  return 0;}static char *format (char const *form, ...){   char buffer[1024];   va_list args;   va_start (args, form);   vsprintf (buffer, form, args);   va_end (args);   return strcpy (malloc (strlen (buffer) + 1), buffer);}]]m4_bmatch([$2], [stmtMerge],[[static YYSTYPEstmtMerge (YYSTYPE x0, YYSTYPE x1){  return format ("<OR>(%s,%s)", x0, x1);}]]))AT_DATA([test-input],[[z + q;T x;T x = y;x = y;T (x) + y;T (x);T (y) = z + q;T (y y) = z + q;z + q;@This is total garbage, but it should be ignored.]])AT_CHECK([bison -o types.c types.y], 0, [], ignore)AT_COMPILE([types])AT_BISON_OPTION_POPDEFS])m4_define([_AT_RESOLVED_GLR_OUTPUT],[[+(z,q)<declare>(T,x)<init-declare>(T,x,y)=(x,y)+(<cast>(x,T),y)<declare>(T,x)<init-declare>(T,y,+(z,q))<error>+(z,q)]])m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC],[[3.0-3.5: +(z,q)5.0-5.3: <declare>(T,x)7.0-7.7: <init-declare>(T,x,y)9.0-9.5: =(x,y)11.0-11.9: +(<cast>(x,T),y)13.0-13.5: <declare>(T,x)15.0-15.13: <init-declare>(T,y,+(z,q))17.0-17.15: <error>19.0-19.5: +(z,q)]])m4_define([_AT_AMBIG_GLR_OUTPUT],[[+(z,q)<declare>(T,x)<init-declare>(T,x,y)=(x,y)+(<cast>(x,T),y)<OR>(<declare>(T,x),<cast>(x,T))<OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))<error>+(z,q)]])m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC],[[3.0-3.5: +(z,q)5.0-5.3: <declare>(T,x)7.0-7.7: <init-declare>(T,x,y)9.0-9.5: =(x,y)11.0-11.9: +(<cast>(x,T),y)13.0-13.5: <OR>(<declare>(T,x),<cast>(x,T))15.0-15.13: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))17.0-17.15: <error>19.0-19.5: +(z,q)]])m4_define([_AT_GLR_STDERR],[[syntax error]])m4_define([_AT_VERBOSE_GLR_STDERR],[[syntax error, unexpected ID, expecting '=' or '+' or ')']])## ---------------------------------------------------- #### Compile the grammar described in the documentation.  #### ---------------------------------------------------- ##AT_SETUP([GLR: Resolve ambiguity, impure, no locations])_AT_TEST_GLR_CXXTYPES([],                      [%dprec 1], [%dprec 2])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,                _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR)AT_CLEANUPAT_SETUP([GLR: Resolve ambiguity, impure, locations])_AT_TEST_GLR_CXXTYPES([%locations],[%dprec 1],[%dprec 2])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,                _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)AT_CLEANUPAT_SETUP([GLR: Resolve ambiguity, pure, no locations])_AT_TEST_GLR_CXXTYPES([%pure-parser],                      [%dprec 1], [%dprec 2])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,                _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR)AT_CLEANUPAT_SETUP([GLR: Resolve ambiguity, pure, locations])_AT_TEST_GLR_CXXTYPES([%pure-parser %locations],                      [%dprec 1], [%dprec 2])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,                _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)AT_CLEANUPAT_SETUP([GLR: Merge conflicting parses, impure, no locations])_AT_TEST_GLR_CXXTYPES([],                      [%merge <stmtMerge>], [%merge <stmtMerge>])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,                _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR)AT_CLEANUPAT_SETUP([GLR: Merge conflicting parses, impure, locations])_AT_TEST_GLR_CXXTYPES([%locations],                      [%merge <stmtMerge>], [%merge <stmtMerge>])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,                _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)AT_CLEANUPAT_SETUP([GLR: Merge conflicting parses, pure, no locations])_AT_TEST_GLR_CXXTYPES([%pure-parser],                      [%merge <stmtMerge>], [%merge <stmtMerge>])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,                _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR)AT_CLEANUPAT_SETUP([GLR: Merge conflicting parses, pure, locations])_AT_TEST_GLR_CXXTYPES([%pure-parser %locations],                      [%merge <stmtMerge>],[%merge <stmtMerge>])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,                _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)AT_CLEANUPAT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations])_AT_TEST_GLR_CXXTYPES([%error-verbose],                      [%merge <stmtMerge>], [%merge <stmtMerge>])AT_PARSER_CHECK([[./types test-input | sed 's/  *$//']], 0,	        _AT_AMBIG_GLR_OUTPUT, _AT_VERBOSE_GLR_STDERR)AT_CLEANUP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -