Теория языков программирования

Автор работы: Пользователь скрыл имя, 20 Ноября 2013 в 10:55, курсовая работа

Краткое описание

В качестве вводной части к курсовому проекту рассмотрим теоретические аспекты лексического и синтаксического анализов.
Лексический анализ – разбиение последовательности символов входного текста на последовательность слов, или лексем.

Содержание

2.Введение 3
3.Постановка задачи 4
4.Грамматика языка программирования обработки строк 5
5.Описание структуры системы программирования 8
6.Руководство пользователя 9
7.Заключение 10
8.Список использованной литературы 11
Приложение 1. Текст программы 12
Приложение 2. Тестовые случаи 32

Прикрепленные файлы: 1 файл

Course_TYAP Зинина Ю.В..doc

— 468.50 Кб (Скачать документ)

    YYFPRINTF Args;    \

} while (0)

 

# define YY_SYMBOL_PRINT(Title, Type, Value, Location)  \

do {        \

  if (yydebug)       \

    {        \

      YYFPRINTF (stderr, "%s ", Title);    \

      yysymprint (stderr,     \

                  Type, Value); \

      YYFPRINTF (stderr, "\n");     \

    }        \

} while (0)

 

/*------------------------------------------------------------------.

| yy_stack_print -- Print the state stack from its BOTTOM up to its |

| TOP (included).                                                   |

`------------------------------------------------------------------*/

 

#if defined (__STDC__) || defined (__cplusplus)

static void

yy_stack_print (short int *bottom, short int *top)

#else

static void

yy_stack_print (bottom, top)

    short int *bottom;

    short int *top;

#endif

{

  YYFPRINTF (stderr, "Stack now");

  for (/* Nothing. */; bottom <= top; ++bottom)

    YYFPRINTF (stderr, " %d", *bottom);

  YYFPRINTF (stderr, "\n");

}

 

# define YY_STACK_PRINT(Bottom, Top)    \

do {        \

  if (yydebug)       \

    yy_stack_print ((Bottom), (Top));    \

} while (0)

 

 

/*------------------------------------------------.

| Report that the YYRULE is going to be reduced.  |

`------------------------------------------------*/

 

#if defined (__STDC__) || defined (__cplusplus)

static void

yy_reduce_print (int yyrule)

#else

static void

yy_reduce_print (yyrule)

    int yyrule;

#endif

{

  int yyi;

  unsigned long int yylno = yyrline[yyrule];

  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",

             yyrule - 1, yylno);

  /* Print the symbols being reduced, and their result.  */

  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)

    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);

  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);

}

 

# define YY_REDUCE_PRINT(Rule)  \

do {     \

  if (yydebug)    \

    yy_reduce_print (Rule);  \

} while (0)

 

/* Nonzero means print parse trace.  It is left uninitialized so that

   multiple parsers can coexist.  */

int yydebug;

#else /* !YYDEBUG */

# define YYDPRINTF(Args)

# define YY_SYMBOL_PRINT(Title, Type, Value, Location)

# define YY_STACK_PRINT(Bottom, Top)

# define YY_REDUCE_PRINT(Rule)

#endif /* !YYDEBUG */

 

 

/* YYINITDEPTH -- initial size of the parser's stacks.  */

#ifndef YYINITDEPTH

# define YYINITDEPTH 200

#endif

 

/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only

   if the built-in stack extension method is used).

 

   Do not make this value too large; the results are undefined if

   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)

   evaluated with infinite-precision integer arithmetic.  */

 

#ifndef YYMAXDEPTH

# define YYMAXDEPTH 10000

#endif

 

#if YYERROR_VERBOSE

 

# ifndef yystrlen

#  if defined (__GLIBC__) && defined (_STRING_H)

#   define yystrlen strlen

#  else

/* Return the length of YYSTR.  */

static YYSIZE_T

#   if defined (__STDC__) || defined (__cplusplus)

yystrlen (const char *yystr)

#   else

yystrlen (yystr)

     const char *yystr;

#   endif

{

  const char *yys = yystr;

 

  while (*yys++ != '\0')

    continue;

 

  return yys - yystr - 1;

}

#  endif

# endif

 

# ifndef yystpcpy

#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)

#   define yystpcpy stpcpy

#  else

/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in

   YYDEST.  */

static char *

#   if defined (__STDC__) || defined (__cplusplus)

yystpcpy (char *yydest, const char *yysrc)

#   else

yystpcpy (yydest, yysrc)

     char *yydest;

     const char *yysrc;

#   endif

{

  char *yyd = yydest;

  const char *yys = yysrc;

 

  while ((*yyd++ = *yys++) != '\0')

    continue;

 

  return yyd - 1;

}

#  endif

# endif

 

# ifndef yytnamerr

/* Copy to YYRES the contents of YYSTR after stripping away unnecessary

   quotes and backslashes, so that it's suitable for yyerror.  The

   heuristic is that double-quoting is unnecessary unless the string

   contains an apostrophe, a comma, or backslash (other than

   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is

   null, do not copy; instead, return the length of what the result

   would have been.  */

static YYSIZE_T

yytnamerr (char *yyres, const char *yystr)

{

  if (*yystr == '"')

    {

      size_t yyn = 0;

      char const *yyp = yystr;

 

      for (;;)

switch (*++yyp)

  {

  case '\'':

  case ',':

    goto do_not_strip_quotes;

 

  case '\\':

    if (*++yyp != '\\')

      goto do_not_strip_quotes;

    /* Fall through.  */

  default:

    if (yyres)

      yyres[yyn] = *yyp;

    yyn++;

    break;

 

  case '"':

    if (yyres)

      yyres[yyn] = '\0';

    return yyn;

  }

    do_not_strip_quotes: ;

    }

 

  if (! yyres)

    return yystrlen (yystr);

 

  return yystpcpy (yyres, yystr) - yyres;

}

# endif

 

#endif /* YYERROR_VERBOSE */

 

#if YYDEBUG

/*--------------------------------.

| Print this symbol on YYOUTPUT.  |

`--------------------------------*/

 

#if defined (__STDC__) || defined (__cplusplus)

static void

yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)

#else

static void

yysymprint (yyoutput, yytype, yyvaluep)

    FILE *yyoutput;

    int yytype;

    YYSTYPE *yyvaluep;

#endif

{

  /* Pacify ``unused variable'' warnings.  */

  (void) yyvaluep;

 

  if (yytype < YYNTOKENS)

    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);

  else

    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);

 

 

# ifdef YYPRINT

  if (yytype < YYNTOKENS)

    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);

# endif

  switch (yytype)

    {

      default:

        break;

    }

  YYFPRINTF (yyoutput, ")");

}

 

#endif /* ! YYDEBUG */

/*-----------------------------------------------.

| Release the memory associated to this symbol.  |

`-----------------------------------------------*/

 

#if defined (__STDC__) || defined (__cplusplus)

static void

yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)

#else

static void

yydestruct (yymsg, yytype, yyvaluep)

    const char *yymsg;

    int yytype;

    YYSTYPE *yyvaluep;

#endif

{

  /* Pacify ``unused variable'' warnings.  */

  (void) yyvaluep;

 

  if (!yymsg)

    yymsg = "Deleting";

  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);

 

  switch (yytype)

    {

 

      default:

        break;

    }

}

 

 

/* Prevent warnings from -Wmissing-prototypes.  */

 

#ifdef YYPARSE_PARAM

# if defined (__STDC__) || defined (__cplusplus)

int yyparse (void *YYPARSE_PARAM);

# else

int yyparse ();

# endif

#else /* ! YYPARSE_PARAM */

#if defined (__STDC__) || defined (__cplusplus)

int yyparse (void);

#else

int yyparse ();

#endif

#endif /* ! YYPARSE_PARAM */

 

/* The look-ahead symbol.  */

int yychar;

 

/* The semantic value of the look-ahead symbol.  */

YYSTYPE yylval;

 

/* Number of syntax errors so far.  */

int yynerrs;

 

/*----------.

| yyparse.  |

`----------*/

 

#ifdef YYPARSE_PARAM

# if defined (__STDC__) || defined (__cplusplus)

int yyparse (void *YYPARSE_PARAM)

# else

int yyparse (YYPARSE_PARAM)

  void *YYPARSE_PARAM;

# endif

#else /* ! YYPARSE_PARAM */

#if defined (__STDC__) || defined (__cplusplus)

int

yyparse (void)

#else

int

yyparse ()

    ;

#endif

#endif

{

  int yystate;

  int yyn;

  int yyresult;

  /* Number of tokens to shift before error messages enabled.  */

  int yyerrstatus;

  /* Look-ahead token as an internal (translated) token number.  */

  int yytoken = 0;

 

  /* Three stacks and their tools:

     `yyss': related to states,

     `yyvs': related to semantic values,

     `yyls': related to locations.

 

     Refer to the stacks thru separate pointers, to allow yyoverflow

     to reallocate them elsewhere.  */

 

  /* The state stack.  */

  short int yyssa[YYINITDEPTH];

  short int *yyss = yyssa;

  short int *yyssp;

 

  /* The semantic value stack.  */

  YYSTYPE yyvsa[YYINITDEPTH];

  YYSTYPE *yyvs = yyvsa;

  YYSTYPE *yyvsp;

 

#define YYPOPSTACK   (yyvsp--, yyssp--)

 

  YYSIZE_T yystacksize = YYINITDEPTH;

 

  /* The variables used to return semantic value and location from the

     action routines.  */

  YYSTYPE yyval;

 

  /* When reducing, the number of symbols on the RHS of the reduced

     rule.  */

  int yylen;

 

  YYDPRINTF ((stderr, "Starting parse\n"));

 

  yystate = 0;

  yyerrstatus = 0;

  yynerrs = 0;

  yychar = YYEMPTY;  /* Cause a token to be read.  */

 

  /* Initialize stack pointers.

     Waste one element of value and location stack

     so that they stay on the same level as the state stack.

     The wasted elements are never initialized.  */

 

  yyssp = yyss;

  yyvsp = yyvs;

 

  goto yysetstate;

 

/*------------------------------------------------------------.

| yynewstate -- Push a new state, which is found in yystate.  |

`------------------------------------------------------------*/

yynewstate:

  /* In all cases, when you get here, the value and location stacks

     have just been pushed. so pushing a state here evens the stacks.

     */

  yyssp++;

 

yysetstate:

  *yyssp = yystate;

 

  if (yyss + yystacksize - 1 <= yyssp)

    {

      /* Get the current used size of the three stacks, in elements.  */

      YYSIZE_T yysize = yyssp - yyss + 1;

 

#ifdef yyoverflow

      {

/* Give user a chance to reallocate the stack. Use copies of

   these so that the &'s don't force the real ones into

   memory.  */

YYSTYPE *yyvs1 = yyvs;

short int *yyss1 = yyss;

 

 

/* Each stack pointer address is followed by the size of the

   data in use in that stack, in bytes.  This used to be a

   conditional around just the two extra args, but that might

   be undefined if yyoverflow is a macro.  */

yyoverflow (YY_("memory exhausted"),

    &yyss1, yysize * sizeof (*yyssp),

    &yyvs1, yysize * sizeof (*yyvsp),

 

    &yystacksize);

yyss = yyss1;

yyvs = yyvs1;

      }

#else /* no yyoverflow */

# ifndef YYSTACK_RELOCATE

      goto yyexhaustedlab;

# else

      /* Extend the stack our own way.  */

      if (YYMAXDEPTH <= yystacksize)

goto yyexhaustedlab;

      yystacksize *= 2;

      if (YYMAXDEPTH < yystacksize)

yystacksize = YYMAXDEPTH;

 

      {

short int *yyss1 = yyss;

union yyalloc *yyptr =

  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));

if (! yyptr)

  goto yyexhaustedlab;

YYSTACK_RELOCATE (yyss);

YYSTACK_RELOCATE (yyvs);

 

#  undef YYSTACK_RELOCATE

if (yyss1 != yyssa)

  YYSTACK_FREE (yyss1);

      }

# endif

#endif /* no yyoverflow */

 

      yyssp = yyss + yysize - 1;

      yyvsp = yyvs + yysize - 1;

 

 

      YYDPRINTF ((stderr, "Stack size increased to %lu\n",

  (unsigned long int) yystacksize));

 

      if (yyss + yystacksize - 1 <= yyssp)

YYABORT;

    }

 

  YYDPRINTF ((stderr, "Entering state %d\n", yystate));

 

  goto yybackup;

 

/*-----------.

| yybackup.  |

`-----------*/

yybackup:

 

/* Do appropriate processing given the current state.  */

/* Read a look-ahead token if we need one and don't already have one.  */

/* yyresume: */

 

  /* First try to decide what to do without reference to look-ahead token.  */

 

  yyn = yypact[yystate];

  if (yyn == YYPACT_NINF)

    goto yydefault;

 

  /* Not known => get a look-ahead token if don't already have one.  */

 

  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */

  if (yychar == YYEMPTY)

    {

      YYDPRINTF ((stderr, "Reading a token: "));

      yychar = YYLEX;

    }

 

  if (yychar <= YYEOF)

    {

      yychar = yytoken = YYEOF;

      YYDPRINTF ((stderr, "Now at end of input.\n"));

    }

  else

    {

      yytoken = YYTRANSLATE (yychar);

      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);

    }

 

  /* If the proper action on seeing token YYTOKEN is to reduce or to

     detect an error, take that action.  */

  yyn += yytoken;

  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)

    goto yydefault;

  yyn = yytable[yyn];

  if (yyn <= 0)

    {

      if (yyn == 0 || yyn == YYTABLE_NINF)

goto yyerrlab;

      yyn = -yyn;

      goto yyreduce;

    }

 

  if (yyn == YYFINAL)

    YYACCEPT;

 

  /* Shift the look-ahead token.  */

  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);

 

  /* Discard the token being shifted unless it is eof.  */

  if (yychar != YYEOF)

    yychar = YYEMPTY;

 

  *++yyvsp = yylval;

 

  /* Count tokens shifted since error; after three, turn off error

     status.  */

  if (yyerrstatus)

    yyerrstatus--;

 

  yystate = yyn;

  goto yynewstate;

 

/*-----------------------------------------------------------.

| yydefault -- do the default action for the current state.  |

`-----------------------------------------------------------*/

yydefault:

  yyn = yydefact[yystate];

  if (yyn == 0)

    goto yyerrlab;

  goto yyreduce;

 

/*-----------------------------.

| yyreduce -- Do a reduction.  |

`-----------------------------*/

yyreduce:

  /* yyn is the number of a rule to reduce with.  */

  yylen = yyr2[yyn];

 

  /* If YYLEN is nonzero, implement the default value of the action:

     `$$ = $1'.

     Otherwise, the following line sets YYVAL to garbage.

     This behavior is undocumented and Bison

     users should not rely upon it.  Assigning to YYVAL

     unconditionally makes the parser a bit smaller, and it avoids a

     GCC warning that YYVAL may be used uninitialized.  */

  yyval = yyvsp[1-yylen];

 

  YY_REDUCE_PRINT (yyn);

  switch (yyn)

    {

        case 5:

#line 21 "bison.txt"

    {    

printf("%s\t", (yyvsp[-8].string));

printf("%s\t", (yyvsp[-5].string));

printf("\t%s", (yyvsp[-4].string));

printf("\n---------------------------------");

printf("\n");

;}

    break;

 

  case 6:

#line 29 "bison.txt"

    {;}

    break;

 

  case 7:

#line 31 "bison.txt"

    {;}

    break;

 

  case 8:

#line 33 "bison.txt"

    {;}

    break;

 

 

      default: break;

    }

 

/* Line 1126 of yacc.c.  */

#line 1192 "bison.c"

 

  yyvsp -= yylen;

  yyssp -= yylen;

 

  YY_STACK_PRINT (yyss, yyssp);

 

  *++yyvsp = yyval;

 

  /* Now `shift' the result of the reduction.  Determine what state

     that goes to, based on the state we popped back to and the rule

     number reduced by.  */

 

  yyn = yyr1[yyn];

 

  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;

  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)

    yystate = yytable[yystate];

  else

    yystate = yydefgoto[yyn - YYNTOKENS];

 

  goto yynewstate;

 

/*------------------------------------.

| yyerrlab -- here on detecting error |

`------------------------------------*/

yyerrlab:

  /* If not already recovering from an error, report this error.  */

  if (!yyerrstatus)

    {

      ++yynerrs;

#if YYERROR_VERBOSE

      yyn = yypact[yystate];

 

      if (YYPACT_NINF < yyn && yyn < YYLAST)

{

  int yytype = YYTRANSLATE (yychar);

  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);

  YYSIZE_T yysize = yysize0;

  YYSIZE_T yysize1;

  int yysize_overflow = 0;

  char *yymsg = 0;

#   define YYERROR_VERBOSE_ARGS_MAXIMUM 5

  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];

  int yyx;

 

#if 0

  /* This is so xgettext sees the translatable formats that are

     constructed on the fly.  */

  YY_("syntax error, unexpected %s");

  YY_("syntax error, unexpected %s, expecting %s");

  YY_("syntax error, unexpected %s, expecting %s or %s");

  YY_("syntax error, unexpected %s, expecting %s or %s or %s");

  YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");

#endif

  char *yyfmt;

  char const *yyf;

  static char const yyunexpected[] = "syntax error, unexpected %s";

  static char const yyexpecting[] = ", expecting %s";

  static char const yyor[] = " or %s";

  char yyformat[sizeof yyunexpected

+ sizeof yyexpecting - 1

+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)

   * (sizeof yyor - 1))];

  char const *yyprefix = yyexpecting;

 

  /* Start YYX at -YYN if negative to avoid negative indexes in

     YYCHECK.  */

  int yyxbegin = yyn < 0 ? -yyn : 0;

 

  /* Stay within bounds of both yycheck and yytname.  */

  int yychecklim = YYLAST - yyn;

  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;

  int yycount = 1;

 

  yyarg[0] = yytname[yytype];

  yyfmt = yystpcpy (yyformat, yyunexpected);

 

  for (yyx = yyxbegin; yyx < yyxend; ++yyx)

    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)

      {

if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)

  {

    yycount = 1;

    yysize = yysize0;

    yyformat[sizeof yyunexpected - 1] = '\0';

    break;

  }

yyarg[yycount++] = yytname[yyx];

yysize1 = yysize + yytnamerr (0, yytname[yyx]);

yysize_overflow |= yysize1 < yysize;

yysize = yysize1;

yyfmt = yystpcpy (yyfmt, yyprefix);

yyprefix = yyor;

      }

 

  yyf = YY_(yyformat);

  yysize1 = yysize + yystrlen (yyf);

  yysize_overflow |= yysize1 < yysize;

  yysize = yysize1;

 

  if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)

    yymsg = (char *) YYSTACK_ALLOC (yysize);

  if (yymsg)

    {

      /* Avoid sprintf, as that infringes on the user's name space.

Don't have undefined behavior even if the translation

produced a string with the wrong number of "%s"s.  */

      char *yyp = yymsg;

      int yyi = 0;

      while ((*yyp = *yyf))

{

  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)

    {

      yyp += yytnamerr (yyp, yyarg[yyi++]);

      yyf += 2;

    }

  else

    {

      yyp++;

      yyf++;

    }

}

      yyerror (yymsg);

      YYSTACK_FREE (yymsg);

    }

  else

    {

      yyerror (YY_("syntax error"));

      goto yyexhaustedlab;

    }

}

      else

#endif /* YYERROR_VERBOSE */

yyerror (YY_("syntax error"));

    }

 

  if (yyerrstatus == 3)

    {

      /* If just tried and failed to reuse look-ahead token after an

error, discard it.  */

 

      if (yychar <= YYEOF)

        {

Информация о работе Теория языков программирования