(上向き構文解析の原理)
http://www.sw.it.aoyama.ac.jp/2016/Compiler/lecture9.html
© 2005-16 Martin J. Dürst 青山学院大学
bisonFactor → FunctionCall | Variable | ArrayElement
FunctionCall → Identifier '(' Parameters ')'
Variable → Identifier
ArrayElement → Identifier '[' Expression ']'
(it is unclear which rule should be selected in Factor when
the next token is Identifier)
Depending on parsing method, additional requirements become necessary:
⇒ A grammar that just produces/recognizes 'words' is not enough
→ Bottom-up parsing)
| Parsing Direction |
Top-Down | Bottom-Up |
|---|---|---|
| General method | Backtracking | Dynamic programming (CYK Algorithm) |
| Widely used method | Recursive descent | LR parsing |
bison OverviewFiles to start with: makefile, calc.y, calc.lex
makeflex, bison, and
gccmake command follows the instructions in the
makefile, executing a minimum of commants to bring everything
up to date make command to your cygwin
installationmakefile (→: tabulator; other
whitespace characters will not work!):target: input1 input2
input3 ...
→command to construct targetmake without arguments will construct the first
target in the makefilemake target will construct
targetmakefile, without
extensionmakefile.txt will not work!)bison Input Format%{
#include <stdio.h>
#define YYSTYPE double
int yylex (void);
void yyerror (char const *);
%}
%token NUM PLUS
%%
statement: exp { printf ("Result is %g\n", $1); }
;
exp: exp PLUS exp { $$ = $1 + $3; }
| NUM { $$ = $1; }
;
%%
int main (void)
{ return yyparse (); }
void yyerror (char const *s)
{ fprintf (stderr, "%s\n", s); }
bison Input Formatbison 関係の宣言など
%{ C 言語の宣言など %}
%%
書換規則 { 実行文 (C 言語) }
書換規則 { 実行文 (C 言語) }
書換規則 { 実行文 (C 言語) }
%%
関数など (C 言語)
関数など (C 言語)
bison Input FormatMixture of bison-specific directives and C program fragments
There are three main parts, separated by %%:
bison#include statements, definition/initialization of global
variables,...%{ ... %}{ ... }) program
fragments that get executed when a rule is matchedNewlines and indentation can be significant
bison Rewriting Ruleexp: exp PLUS exp { $$ = $1 + $3; }
| NUM { $$ = $1; }
;
:) instead of arrow (→);) at the endE0 → E1 '-'
E3E0) =
S(E1) - S(E3)bison: $$ = $1 - $3bison Manualbison Programsdiff commanddiff, the test is successfulDeadline: June 9, 2016 (Thursday), 19:00
Where to submit: Box in front of room O-529 (building O, 5th floor)
Complete calc.y so that with test.in as an input, it produces test.check
Submit calc.y only, A4 single page (using both sides is okay;
NO cover page, staple in top left corner if more than one page is necessary),
printout (no wrapping lines), name (kanji and kana) and
student number in comment at the top right
If there are differences with newlines, make sure that all files use Unix
line ending convention
(In Notepad2, choose File → Line Endings → Unix (LF))