Язык Си в примерах/Калькулятор выражений в обратной польской нотации на Bison: различия между версиями

нет описания правки
м (<source> -> <syntaxhighlight> (phab:T237267))
Нет описания правки
Метки: правка через визуальный редактор правка с мобильного устройства правка из мобильной версии
 
=== Файл с правилами <tt>bison</tt> ===
<code>
 
<!-- <syntaxhighlight lang="bison"> -->
/*
file: rpn.yy
title: Reverse polish notation calculator rules.
*/
%{
#define YYSTYPE double
#include <math.h>
#include <stdio.h>
%}
%token NUM
%% /* Grammar rules and actions follow */
input: /* empty */
| input line
;
line: '\n'
| exp '\n' { printf ("\t%.10g\n", $1); }
;
exp: NUM { $$ = $1; }
| exp exp '+' { $$ = $1 + $2; }
| exp exp '-' { $$ = $1 - $2; }
| exp exp '*' { $$ = $1 * $2; }
| exp exp '/' { $$ = $1 / $2; }
/* Exponentiation */
| exp exp '^' { $$ = pow ($1, $2); }
/* Unary minus */
| exp 'n' { $$ = -$1; }
;
%%
<!-- </syntaxhighlight> -->
</code>
 
 
1. В данный файл описания грамматики(сразу после "#include <stdio.h>" и до "%}") пришлось добавить прототипы ф-ий "yylex", "yyerror" (определенных в «main»):
int yylex (void);
int yyerror (const char *s);
 
2. Вместо команды «cpp» - трансляцию-сборку всего примера пришлось выполнять при помощи команды «c++».
 
Анонимный участник