Hi. I'm running a lexical analyzer using lex, and I've got it mostly correct, but my terminal gives strange output once I take out an ECHO statement I was using to help debug the code. With that statement, my output looks like this:
max@Max-Ubuntu:~/Desktop/Compiler Project/project2$ ./a.out <../cmmFiles/expression.cmm
VOIDID(){
INTID,ID,ID;
BOOLID,ID,ID;
ID(ID);
ID(ID);
ID(ID);
ID(ID);
ID=-ID-NUM+ID/NUM*(-NUM+ID*IDNUM);
ID(ID);
ID=ID>ID||ID>=ID;
IF(ID)ID(NUM);ELSEID(NUM);
ID=ID<ID&&ID<=ID;
IF(ID==TRUE)ID(NUM);ELSEID(NUM);
ID=ID&&!ID||!ID&&ID;
IF(ID!=FALSE)ID(NUM);ELSEID(NUM);
}
While hard to read, that output is correct. Once I take out the ECHO statement, I instead get this:
max@Max-Ubuntu:~/Desktop/Compiler Project/project2$ ./a.out <../cmmFiles/expression.cmm
}F(ID!=FALSE)ID(NUM);ELSEID(NUM);;
It looks like it's only outputting the final line, except with an extraneous } near the beginning, what looks like half an IF token immediately after, and an extraneous ; at the end.
Is this some quirk of my terminal, or does removing that ECHO cause my lexer to screw up that badly? I'm hesitant to keep working until I know for sure what's going on here. Thanks for any answers.
Here's my lexer:
%{
/*
definitions of manifest constants
-reserved words-
BOOL, ELSE, IF, TRUE, WHILE, DO, FALSE, INT, VOID
-Punctuation and operators-
LPAREN, RPAREN, LBRACK, RBRACK, LBRACE, RBRACE, SEMI, COMMA, PLUS, MINUS, TIMES,
DIV, MOD, AND, OR, NOT, IS, ADDR, EQ, NE, LT, GT, LE, GE
-Other tokens-
NUMBER, ID, PUNCT, OP
*/
#include <stdio.h>
#include <stdlib.h>
//#include "y.tab.h"
//int line = 1, numAttr;
//char *strAttr;
%}
/* regular definitions */
delim [ \t]
ws {delim}+
start "/*"
one [^*]
two "*"
three [^*/]
end "/"
comment {start}({one}*{two}+{three})*{one}*{two}+{end}
letter [A-Za-z]
digit [0-9]
id ({letter}|_)({letter}|{digit}|_)*
number {digit}+
%%
{ws} { /*no action and no return */}
{comment} { /*no action and no return */}
[\n] {ECHO; /*no action */} // <-- this is the ECHO in question.
bool { printf("BOOL");}
else { printf("ELSE");}
if { printf("IF");}
true { printf("TRUE");}
while { printf("WHILE");}
do { printf("DO");}
false { printf("FALSE");}
int { printf("INT");}
void { printf("VOID");}
{id} { printf("ID");}
{number} { printf("NUM");}
"(" { printf("(");}
")" { printf(")");}
"[" { printf("[");}
"]" { printf("]");}
"{" { printf("{");}
"}" { printf("}");}
";" { printf(";");}
"," { printf(",");}
"+" { printf("+");}
"-" { printf("-");}
"*" { printf("*");}
"/" { printf("/");}
"%" { printf("%");}
"&" { printf("&");}
"&&" { printf("&&");}
"||" { printf("||");}
"!" { printf("!");}
"!=" { printf("!=");}
"=" { printf("=");}
"==" { printf("==");}
"<" { printf("<");}
"<=" { printf("<=");}
">" { printf(">");}
">=" { printf(">=");}
%%
int main()
{
yylex();
printf("\n");
}
int yywrap(void)
{
return 1;
}
here's the file it's analyzing:
/* this program
* illustrates evaluation of
* arithmetic and boolean
* expressions
*/
void main( ) {
int m,n,p;
bool a,b,c;
scan(m);
print(m);
scan(n);
print(n);
p=-m-3+n/2*(-5+m*n%4);
print(p);
a=m>n || n>=p;
if (a) print(1); else print(0);
b=m<n && n<=p;
if (b==true) print(1); else print(0);
c=a && !b || !a && b;
if (c!=false) print(1); else print(0);
}