/* SI 413 Fall 2011 * Lab 6 * pat.ypp * Parser for pat that just shows the parse tree */ %{ #include <cstdlib> #include <iostream> using namespace std; #include "parsetree.hpp" ParseTree* tree; // This global will be set to the whole parse tree. int yylex(); int yyerror(const char *p) { cerr << "Parse error!" << endl; } %} %token SYM FOLD STOP COLON NAME REV LB RB %% /*Note: YYACCEPT is a bison macro that just tells it to quit parsing.*/ S: seq STOP { tree = $1; YYACCEPT; } | { tree = NULL; } seq: seq FOLD catseq {$$ = new ParseTree("seq",$1,$2,$3);} | catseq {$$ = new ParseTree("seq",$1);} catseq: catseq opseq {$$ = new ParseTree("catseq",$1,$2);} | opseq {$$ = new ParseTree("catseq",$1);} opseq: opseq COLON NAME {$$ = new ParseTree("opseq",$1,$2,$3);} | opseq REV {$$ = new ParseTree("opseq",$1,$2);} | atom {$$ = new ParseTree("opseq",$1);} atom: SYM | NAME {$$ = new ParseTree("atom",$1);} | LB seq RB {$$ = new ParseTree("atom",$1,$2,$3)} %% int main() { while(true) { yyparse(); if (tree == NULL) break; tree->writeDot("pat.dot"); system("dot -Tpdf pat.dot > pat.pdf"); system("evince pat.pdf &"); } return 0; }