Skip to main content

4. Lex and Yacc Program to detect errors in a 'C' Language Program


Lex and Yacc Program to detect errors in a 'C' Language Program 
 
Lex Code:

%{
#include"y.tab.h"
#include<stdio.h>
int LineNo=1;
%}

identifier[a-zA-Z][_a-zA-Z0-9]*

number [0-9]+|([0-9]*\.[0-9]+)

%%

main\(\) return MAIN;
if return IF;
else return ELSE;

while return WHILE;

int |
char |
flaot return TYPE;

{identifier} return VAR;
{number} return NUM;
\> |
\< |
\<= |
\>= |
== return RELOP;
[\t] ;
[\n] LineNo++;
. return yytext[0];
%%


Yacc Code:

%{
#include<string.h>
#include<stdio.h>

extern int LineNo;

int errno=0;
%}

%token NUM VAR RELOP
%token MAIN IF ELSE WHILE TYPE

%left '-' '+'

%left '*' '/'

%%
PROGRAM: MAIN BLOCK
;
BLOCK: '{'CODE'}'

;

CODE: BLOCK
|STATEMENT CODE
|STATEMENT
;

STATEMENT:DECST';'
|DECST {printf("\nLine number %d:syntax error",lineNo);errno++;}
|ASSIGNMENT ';'

|ASSIGNMENT {printf("\nLine number %d:syntax error",lineNo);errno++;}
|CONDST
|WHILEST

;

DECST: TYPE VARLIST
;
VARLIST: VAR ','VARLIST

| VAR
;
ASSIGNMENT:VAR'='EXPR
;

EXPR: EXPR '+' EXPR

| EXPR '-' EXPR
| EXPR '*' EXPR
| EXPR '/' EXPR

| '-' EXPR
| '(' EXPR ')'
| VAR

| NUM
;

CONDST: IFST
| IFST ELSEST
;

IFST: IF '(' CONDITION ')'
 BLOCK
;

ELSEST: ELSE
 BLOCK
;

CONDITION: VAR RELOP VAR
| VAR

| NUM
;

WHILEST: WHILELOOP
;

WHILELOOP: WHILE '(' CONDITION ')'

 BLOCK
;
%%
extern FILE *yyin;

int main(int argc, char *argv[])
{

 FILE *fp;
 int i;
 /*Check for cmd line args*/
 if(argc>1)
 {

 /*open file in read mode*/ 
 fp = fopen(argv[1],"r");
 if(!fp)
 {

  printf("\n File not found");  
  exit(0);
 }//end if
 yyin = fp;
 }//end if

 yyparse();
 /*
 check for the number of errors present and display
 the read message
 */
 if(errno==0)
  printf("\nNo errors found!\n");

 else
  printf("\n%d error(s) found!\n",errno);
 return(0);
}//End main


/* error handling routine which gets called if a statement cannot be
 parsed with the grammer defined */
 yyerror()
 {
  printf("\nSyntax Error on line %d\n",LineNo);
  errno++;
 }//End yyerror




Comments

Post a Comment

Popular posts from this blog

Selenium + Python + UnexpectedAlertPresentException: Dealing with annoying alerts

Handling  UnexpectedAlertPresentException   Alerts who hates them? I Do!  Who doesn't hate an annoying alert causing your tests / scraping job to fail? I must say they are pretty much on point on the Unexpected part!  Fortunately, there are easy ways to mitigate the issue. 1. Disable alerts completely: driver . execute_script( 'window.alert = function(){};' ); execute this script just before where you anticipate the alert and you're golden. 2. You want to see the alert text but not disturb the execution flow. driver . execute_script( 'window.alert = console.info;' ); Now the alerts have been redirected to the console and you don't have to worry about them. (Unless you have to - then you'd have to monitor the console) 3. You know exactly when it comes and want to accept the alert and move on. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 from selenium import webdriver from selenium.webdriver.s...

2. Lex program that detects statement type i.e. Simple or Compound

Lex program that detects statement type i.e. Simple or Compound Note: Only AND | OR | BUT conjunctions are supported. Program: % option noyywrap %{ char test = 's' ; %} %% ( "" [ aA ][ nN ][ dD ] "" )|( "" [ oO ][ rR ] "" )|( "" [ bB ][ uU ][ tT ] "" ) { test = 'c' ;} . {;} \ n return 0 ; %% main () { yylex (); if ( test == 's' ) printf ( "\n Its a simple sentence" ); else if ( test == 'c' ) printf ( "\n This is compound sentence" ); }