Lex & Yacc (GNU distribution - flex & bison) Jeonghwan Park

Similar documents
Introduction to Lex & Yacc. (flex & bison)

Syntax Analysis Part IV

An Introduction to LEX and YACC. SYSC Programming Languages

PRACTICAL CLASS: Flex & Bison

Yacc Yet Another Compiler Compiler

CSCI Compiler Design

Lexical and Syntax Analysis

LECTURE 11. Semantic Analysis and Yacc

CSE302: Compiler Design

Lexical and Parser Tools

Introduction to Yacc. General Description Input file Output files Parsing conflicts Pseudovariables Examples. Principles of Compilers - 16/03/2006

Lex & Yacc. By H. Altay Güvenir. A compiler or an interpreter performs its task in 3 stages:

Lex & Yacc. by H. Altay Güvenir. A compiler or an interpreter performs its task in 3 stages:

Etienne Bernard eb/textes/minimanlexyacc-english.html

Compiler Design 1. Yacc/Bison. Goutam Biswas. Lect 8

Using an LALR(1) Parser Generator

COMPILER CONSTRUCTION LAB 2 THE SYMBOL TABLE. Tutorial 2 LABS. PHASES OF A COMPILER Source Program. Lab 2 Symbol table

An introduction to Flex

Syntax Analysis Part VIII

Yacc: A Syntactic Analysers Generator

Parsing. COMP 520: Compiler Design (4 credits) Professor Laurie Hendren.

Big Picture: Compilation Process. CSCI: 4500/6500 Programming Languages. Big Picture: Compilation Process. Big Picture: Compilation Process.

Principles of Programming Languages

TDDD55 - Compilers and Interpreters Lesson 3

COMPILERS AND INTERPRETERS Lesson 4 TDDD16

Lexical and Syntax Analysis

Lesson 10. CDT301 Compiler Theory, Spring 2011 Teacher: Linus Källberg

Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

Big Picture: Compilation Process. CSCI: 4500/6500 Programming Languages. Big Picture: Compilation Process. Big Picture: Compilation Process

TDDD55- Compilers and Interpreters Lesson 3

The structure of a compiler

Preparing for the ACW Languages & Compilers

Yacc. Generator of LALR(1) parsers. YACC = Yet Another Compiler Compiler symptom of two facts: Compiler. Compiler. Parser

Flex and lexical analysis

CS143 Handout 12 Summer 2011 July 1 st, 2011 Introduction to bison

Automatic Scanning and Parsing using LEX and YACC

(F)lex & Bison/Yacc. Language Tools for C/C++ CS 550 Programming Languages. Alexander Gutierrez

Module 8 - Lexical Analyzer Generator. 8.1 Need for a Tool. 8.2 Lexical Analyzer Generator Tool

Parsing How parser works?

Compiler Lab. Introduction to tools Lex and Yacc

COMPILER CONSTRUCTION Seminar 02 TDDB44

TDDD55- Compilers and Interpreters Lesson 2

Type 3 languages. Regular grammars Finite automata. Regular expressions. Deterministic Nondeterministic. a, a, ε, E 1.E 2, E 1 E 2, E 1*, (E 1 )

Using Lex or Flex. Prof. James L. Frankel Harvard University

flex is not a bad tool to use for doing modest text transformations and for programs that collect statistics on input.

Gechstudentszone.wordpress.com

Concepts. Lexical scanning Regular expressions DFAs and FSAs Lex. Lexical analysis in perspective

Chapter 4. Lexical analysis. Concepts. Lexical scanning Regular expressions DFAs and FSAs Lex. Lexical analysis in perspective

Edited by Himanshu Mittal. Lexical Analysis Phase

Lexical Analysis. Implementing Scanners & LEX: A Lexical Analyzer Tool

HW8 Use Lex/Yacc to Turn this: Into this: Lex and Yacc. Lex / Yacc History. A Quick Tour. if myvar == 6.02e23**2 then f(..!

Hyacc comes under the GNU General Public License (Except the hyaccpar file, which comes under BSD License)

CSC 467 Lecture 3: Regular Expressions

LEX/Flex Scanner Generator

Lab 2. Lexing and Parsing with Flex and Bison - 2 labs

As we have seen, token attribute values are supplied via yylval, as in. More on Yacc s value stack

LECTURE 7. Lex and Intro to Parsing

Gechstudentszone.wordpress.com

Lex and Yacc. A Quick Tour

Chapter 3 Lexical Analysis

A Bison Manual. You build a text file of the production (format in the next section); traditionally this file ends in.y, although bison doesn t care.

Marcello Bersani Ed. 22, via Golgi 42, 3 piano 3769

Compiler course. Chapter 3 Lexical Analysis

Syn S t yn a t x a Ana x lysi y s si 1

Syntax-Directed Translation

Applications of Context-Free Grammars (CFG)

Chapter 3 -- Scanner (Lexical Analyzer)

Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

Chapter 2: Syntax Directed Translation and YACC

CS143 Handout 04 Summer 2011 June 22, 2011 flex In A Nutshell

UNIT - 7 LEX AND YACC - 1

COMP 520 Fall 2012 Scanners and Parsers (1) Scanners and parsers

Last Time. What do we want? When do we want it? An AST. Now!

Concepts Introduced in Chapter 3. Lexical Analysis. Lexical Analysis Terms. Attributes for Tokens

CSE302: Compiler Design

Introduction to Compiler Design

Table of Contents. Chapter 1. Introducing Flex and Bison

A Pragmatic Introduction to Abstract Language Analysis with Flex and Bison under Windows DRAFT

Compiler Construction Assignment 3 Spring 2018

Ray Pereda Unicon Technical Report UTR-03. February 25, Abstract

Lex and Yacc. More Details

THE COMPILATION PROCESS EXAMPLE OF TOKENS AND ATTRIBUTES

Compiler Construction

Scanning. COMP 520: Compiler Design (4 credits) Professor Laurie Hendren.

EXPERIMENT NO : M/C Lenovo Think center M700 Ci3,6100,6th Gen. H81, 4GB RAM,500GB HDD

Flex and lexical analysis. October 25, 2016

CS 403: Scanning and Parsing

Compiler construction in4020 lecture 5

CS4850 SummerII Lex Primer. Usage Paradigm of Lex. Lex is a tool for creating lexical analyzers. Lexical analyzers tokenize input streams.

EXPERIMENT NO : M/C Lenovo Think center M700 Ci3,6100,6th Gen. H81, 4GB RAM,500GB HDD

L L G E N. Generator of syntax analyzier (parser)

Topic 5: Syntax Analysis III

Compiler Front-End. Compiler Back-End. Specific Examples

Parsing and Pattern Recognition

Compiler construction 2002 week 5

Advances in Compilers

Compiler Construction

Figure 2.1: Role of Lexical Analyzer

IBM. UNIX System Services Programming Tools. z/os. Version 2 Release 3 SA

Introduction to Compilers and Language Design

Transcription:

Lex & Yacc (GNU distribution - flex & bison) Jeonghwan Park

Prerequisite Ubuntu Version 14.04 or over Virtual machine for Windows user or native OS flex bison gcc Version 4.7 or over Install in Ubuntu sudo apt-get install flex bison gcc

Flex Bison source code Flex Input: sample.l Output: lex.yy.c Execution command Bison $> flex sample.l Input: sample.y Output: sample.tab.c sample.tab.h Execution command $> bison -d sample.y

Lex & Yacc (flex & bison) lexical rules (regular expression) lexical rules (context-free grammar) lex (flex) yacc (bison) Input yylex() yyparse() Processed output

Working Version of Automated Software Input program lex.yy.c yylex() { } (2) call yylex() 12 + 26 (3) next token: (NUM, 12) myparser.tab.c yyparse() { } syntax tree + main.c (1) call yyparse() 12 26 main() { }

Lex A Lexical Analyzer Generator Source A table of regular expressions and corresponding program fragments Optional user codes Output: lex.yy.c ( yylex() ) The table is translated to a program which Reads an input stream Copy the input to an output stream Partition the input strings which match the given expressions As each such string is recognized the corresponding program fragment is executed User codes are simply copied to the output

Lex Format of Input File %{ #include <stdio.h> #include <stdlib.h> #include bison.tab.h void mycode(char *); %} name ALPHA [A-Za-z] DIGIT [0-9] definition headers Units definitions pattern ({ALPHA})({ALPHA} {DIGIT})* { } action printf( ID = %s\n, yytext); return LETTER; rules ({DIGIT})+ mycode(yytext); void mycode(char* text) { printf( NUMBER = %d\n, atoi(yytext)); return NUMBER; } user codes

Flex on the run $ ls dn.l main.c sample.c $ flex dn.l $ ls dn.l lex.yy.c main.c sample.c $ gcc lex.yy.c main.c lfl $ ls a.out dn.l lex.yy.c main.c sample.c $./a.out Ctrl-D $./a.out < sample.c $ cat main.c main() { yylex(); }

Regular Expressions. matches any single character * matches zero or more copies of preceding expression + matches one or more copies of preceding expression? matches zero or one copy of preceding expression -?[0-9]+ : signed numbers including optional minus sign [] matches any character within the brackets [Abc1], [A-Z], [A-Za-z], [^123A-Z] ^ matches the beginning of line $ matches the end of line \ escape metacharacter e.g. \* matches with * matches either the preceding expression or the following abc ABC () groups a series of regular expression (123)(123)* exclude [123A-Z]

Yacc Yet Another Compiler-Compiler Similar to Lex Input: Context Free Grammar (CFG) Definitions Grammar Rules User Codes Output: <filename>.tab.h, <filename>.tab.c ( yyparse() )

Yacc Analysis of AST %{ #include <stdio.h> #include AST.h %} struct_type token %type <ptr_letter> LETTER %type <ptr_digit> DIGIT headers Declarations definitions pattern action LETTER :.. {... } DIGIT :.. { } yyerror ( this is error ); void yyerror (char* text) { return fprintf(stderr, %s\n, text); } Grammar Rules user codes

Yacc with Lex - an example <calc.l> /* Definitions */ %{ #include <stdlib.h> #include calc.tab.h %} NUMBER [0-9]+ /* Rules */ {NUMBER} { yylval = atoi(yytext); return NUMBER; } + { return PLUS; } * { return MULT; } \n { return EOL; }. { yyerror( unexpected char ); } /* User Code */ <calc.y> /* Definitions */ %{ #include <stdio.h> %} %token NUMBER PLUS MULT EOL /* Rules */ goal: eval goal {} eval {} ; eval: expr EOL { printf( = %d\n, $1); } ; expr: NUMBER { $$ = $1; } expr PLUS expr { $$ = $1 + $3; } expr MULT expr { $$ = $1 * $3; } ; /* User Code */ int yyerror(char *s) { return printf( %s n, s); }

Associativity & Precedence Specify associativity & precedence %token NUMBER PLUS MULT EOL ASSN %token NUMBER EOL %left PLUS %left MULT %right ASSN Precedence level Lowest Highest Change the grammar rules expr0: NUMBER { $$ = $1; } ; expr1: expr0 { $$ = $1; } expr1 MULT expr0 { $$ = $1 * $3; } ; expr2: expr1 { $$ = $1; } expr2 PLUS expr1 { $$ = $1 + $3; } ; If-else conflict can be resolved in yacc by specifying precedence

Precedence for If-Then and If-Then-Else <clang.y> /* Definitions */ %token NUMBER EOL %left PLUS %left MULT %nonassoc IF_THEN %nonassoc ELSE /* Rules */ stmt : IF ( expr ) stmt %prec IF_THEN { } IF ( expr ) stmt ELSE stmt { } /* User Code */

Tips For Lex (flex) Single character can be used as token char c = yytext[0]; String should be duplicated to safely pass outside the scanner yylval.str = strndup(yytext, yyleng); For Yacc (bison) Token and nonterminal symbol have type %union { Exp* exp; char* str; } %token <str> ID %type <exp> expr

Bison on the run $ ls calc.l calc.y main.c <main.c> main() $ flex calc.l $ ls { yyparse(); } calc.l calc.y lex.yy.c main.c $ bison d calc.y $ ls calc.l calc.y lex.yy.c calc.tab.c calc.tab.h main.c $ gcc -o calc.out calc.tab.c lex.yy.c main.c lfl $ ls calc.l calc.y lex.yy.c calc.tab.c calc.tab.h main.c calc.out $./calc.out

Symbol Table Symbol Table Location : main Count Type Name Array Role 1 int argc - parameter 2 float f 4 variable Location : main For(1) If(1) Count Type Name Array Role 1 int a - variable