[Beginner Question]A question about yacc & lex

Started by Wen Yialmost 3 years ago2 messagesgeneral
Jump to latest
#1Wen Yi
896634148@qq.com

Hi team,
now I'm learning the yacc & lex to understand the principle of the postgres's parser.
And I write a test program as this:

/*
    array.l
        Array program
    Wen Yi
*/
%option noyywrap
%option noinput

%{
#include <stdlib.h&gt;
#include "y.tab.h"
%}

%%

[0-9]+ { yylval.number = atoi(yytext); return NUMBER;}

\n { return END; }

%%

/*
&nbsp;&nbsp; &nbsp;array.y
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Array program
&nbsp;&nbsp; &nbsp;Wen Yi
*/

%{
#include <stdio.h&gt;
int yylex();
int yyerror(char *s);
%}
%token NUMBER
%token END
%union
{
&nbsp;&nbsp; &nbsp;int number;
}

%%

end:
| array_list END { printf ("= %d\n", $1.number); }

array_list: array { $$.number = $1.number; }

array: number { $$.number = $1.number; }
| array number { $$.number = $1.number + $2.number; }

number: NUMBER { $$.number = $1.number;&nbsp; }

%%

int main(int argc, char *argv[])
{
&nbsp;&nbsp; &nbsp;yyparse();
}
int yyerror(char *s)
{
&nbsp;&nbsp; &nbsp;puts(s);
}

The running result is this:

[beginnerc@bogon code]$ ./a.out
1 2 3 4 5 6
&nbsp;&nbsp;&nbsp;&nbsp; = 21
1
syntax error

I don't know&nbsp; why are there many extra spaces in the output, and why the error message 'syntax error' is showed.
Can someone give me some advice?
Thanks in advance!

Yours,
Wen Yi

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Wen Yi (#1)
Re: [Beginner Question]A question about yacc & lex

"=?ISO-8859-1?B?V2VuIFlp?=" <896634148@qq.com> writes:

I don't know why are there many extra spaces in the output, and why the error message 'syntax error' is showed.

You didn't say exactly what you typed at it, but:

Your flex lexer lacks actions for many possible input characters,
notably spaces. I seem to recall that the default action in
such cases is to print the character on stdout.

The grammar lacks any way to deal with any input after the
first newline. Anything except EOF will draw a syntax error.

regards, tom lane