commit 5c04cc190d4bd20243bd2da081a6c2e17ed8e6a9
parent 1ad6eb865750ec1c626341f349228919364cb552
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Wed, 3 Jul 2013 17:27:55 +0200
Store operators characters in yytext
yytext is used for reporting errors, so no updating it will means
incorrect error information.
Diffstat:
M | lex.c | | | 33 | ++++++++++++++++++++++++--------- |
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/lex.c b/lex.c
@@ -82,12 +82,16 @@ skip(void)
static unsigned char
follow(unsigned char op, unsigned char eq, unsigned char rep)
{
- register char c;
+ register char c = getc(yyin);
- if ((c = getc(yyin)) == '=')
+ yytext[1] = c;
+ yytext[2] = '\0';
+ if (c == '=')
return eq;
else if (c == op && rep)
return rep;
+
+ yytext[1] = '\0';
ungetc(c, yyin);
return op;
}
@@ -98,15 +102,22 @@ rel_shift(unsigned char op)
static char tokens[2][3] = {
{GE, SHL, SHL_EQ},
{LE, SHR, SHR_EQ}};
- register char c;
+ register char c = getc(yyin);
register char *tp = tokens[op == '>'];
- if ((c = getc(yyin)) == '=') {
+ yytext[1] = c;
+ yytext[2] = '\0';
+ if (c == '=') {
return tp[0];
} else if (c == op) {
- if ((c = getc(yyin)) == '=')
+ if ((c = getc(yyin)) == '=') {
+ yytext[2] = c;
+ yytext[3] = '\0';
return tp[2];
+ }
op = tp[1];
+ } else {
+ yytext[1] = '\0';
}
ungetc(c, yyin);
return op;
@@ -115,13 +126,15 @@ rel_shift(unsigned char op)
static unsigned char
minus(void)
{
- register int c;
+ register int c = getc(yyin);
- switch (c = getc(yyin)) {
+ yytext[1] = c;
+ switch (c) {
case '-': return DEC;
case '>': return INDIR;
case '=': return SUB_EQ;
default:
+ yytext[1] = '\0';
ungetc(c, yyin);
return '-';
}
@@ -130,9 +143,11 @@ minus(void)
static unsigned char
operator(void)
{
- register unsigned char c;
+ register unsigned char c = getc(yyin);
- switch (c = getc(yyin)) {
+ yytext[0] = c;
+ yytext[1] = '\0';
+ switch (c) {
case '=': return follow('=', EQ, 0);
case '^': return follow('^', XOR_EQ, 0);
case '*': return follow('*', MUL_EQ, 0);