(上向き構文解析の原理)
http://www.sw.it.aoyama.ac.jp/2016/Compiler/lecture9.html
© 2005-16 Martin J. Dürst 青山学院大学
bison
Factor → 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
make
flex
, bison
, and
gcc
make
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 target
make
without arguments will construct the first
target in the makefile
make target
will construct
target
makefile
, 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 '-'
E3
E0
) =
S(E1
) - S(E3
)bison
: $$ = $1 - $3
bison
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))