help-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: My Flex/Bison process is stalling when trying to read a left bracket


From: Philip Herron
Subject: Re: My Flex/Bison process is stalling when trying to read a left bracket.
Date: Mon, 10 Aug 2009 06:14:57 +0100
User-agent: Thunderbird 2.0.0.22 (X11/20090608)

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

address@hidden wrote:
> The processes proceed well until the compiler generated encounters
> an opening bracket. I get the following output...
>
> This is the cln file Aug 2 2009 [sudo] password for joe: removing
> lex.yy.c rm: cannot remove `lex.yy.c': No such file or directory
> removing lex.yy.o rm: cannot remove `lex.yy.o': No such file or
> directory removing parse.tab.h removing parse.tab.c removing
> parse.tab.o ---> calling bison_program ---> calling flex_program
> lex.l:75: negative range in character class ---> compiling lexer
> gcc: lex.yy.c: No such file or directory gcc: no input files --->
> compiling parser parse.tab.c: In function ‘yyparse’:
> parse.tab.c:1391: warning: implicit declaration of function ‘yylex’
>  ---> linking gcc: lex.yy.o: No such file or directory
>
> V.1 started
>
>
> project Compiler (c) 2009
>
>
> Initialising symbol table
>
>
> Calling yyparse(), there should be debug outputs
>
> domain line is D0 11 0 10 domain line is D1 10 11 20 ln 97.
> Constant line is X0 D0 1 ln 97. Constant line is X1 D1 12 ln 97.
> Constant line is X2 D0 2 ln 97. Constant line is X3 D1 15 ln 97.
> Constant line is X4 D0 6 ln 97. Constant line is X5 D1 20 In lex
> 40, found an OR syntax error
>
> Completed yyparse()
>
> ---------------------------------------- After 'Calling
> yyparse()...'  the compiler reads infile.i and simply confirms the
> parsing of the domains and constants.  Things get mysterious after
> 'In lex 40, found an OR'.  This simply confirms that the first
> token of the predicates following the above domains and constants
> has started. But then as you see above, the program stalls with a
> 'syntax error'.
>
> At this point the next token in the input.i stream is and opening
> bracket. But it doesn't seem to get read.  There is provision for
> the brackets in parse.y as... %token '(' ')'        /* left parenthesis,
> r parenthesis @ line 59*/ and in lex.l as... "("        {printf("found a
> (\n");return '(';} /*line 48 */... but it never gets to this in
> lex.l There is a line of code at lex.l 75 which may or may not be
> causing a problem... address@hidden         { /* error, unexpected
> char */.... it's an intended exclusion list.
>
> I have included all the relevant files associated with this small
> project, and if you copy them into a directory, then calling
> ./compile should cause execution of the shell scripts to build and
> execute the eventual compiler which is generated.
>
> The list of files attached are... lex.l  THE SOURCE FOR THE LEXER
> parse.y THE SOURCE FOR THE PARSER symtable.h THE SYMBOL TABLE
> header file. infile.i THE SOURCE FILE TO FEED TO OUR GENERATED
> COMPILER IT COMPRISES 2 DOMAIN LINES, 6 CONSTANTS LINES followed by
>  a LIST OF PREDICATES. cln  WHICH CLEANS OFF THE OLD OBJECT FILES
> ETC READY FOR A NEW COMPILATION. compile WHICH PROCESSES THE FLEX
> AND BISON SOURCES THEN LINKS, AND EXECUTES.
>
> Once the files are into a separate directory, then simply entering
> 'compile' will attempt to build and execute the consequent files
> generated. You should get output same as down to the
> -------------------- separator.
>
> Any help is appreciated, thanks.  Joe Garvey, Cork, Ireland
>
> ----------------------------------------------------------------------
>
>
> _______________________________________________ address@hidden
> http://lists.gnu.org/mailman/listinfo/help-bison

Hi

Ah i see your from ireland so am I :-) .

Anyways yeah looking at your lexer it wouldn't generate for me but i
just changed that line 75 instead of hard-coding a token that will
cause a syntax fail just stuck '.' in.

Anyways your problem is probably with your parser, i am not quite sure
what this language is or is meant to be.

Is the structure having to be Domain (what ever you mean by that),
constants and predicates.

So anyways the problem is your exp: rule, you have exp can be of the form:

( expression )
or
MAX ( number, number )
....

What you have your .i file is

'or(lt(mul(X0,X1),X2),ge(abs(sub(X3,X4)),X5))'

So that is an

OR ( exp )

The way i would do this would be something like splitting it up alot,

OPERATION: OR
                    | LE
                    | EQ
                    ...
                    ;

predicate: OPERATION '( ' expr ')'

//wait do these accept numbers or does it have to be an X0 or D0 in
that cause your going to want to make sure you have a hash table to
lookup to make sure they are defined symbols before running on null
pointers anyways..

param: NUM ',' NUM
           | DOMAIN ',' DOMAIN
           | expr ',' expr
           ...
          ;
   
expr: OPERATION '('  param ')'
        | OPERATION '(' expr ')'

hmm... something like that i am not sure if that will work properly
but give it ago maby gives you something to think about :)

Also you might want to check out automake to generate yourself a
makefile instead of a compile script.

To make an automake for your project would be

Makefile.am:

bin_PROGRAMS = parser
parser_SOURCES = parse.y lex.l bla.c ....

done :)

Hope this helps

- --Phil
http://redbrain.co.uk
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkp/rM4ACgkQAhcOgIaQQ2G/EwCbB8uiaLT1aILcnXG5DL+1+dGk
aWAAniwZlGoJozJdmMaXC+a0K8cpjNCx
=GuN/
-----END PGP SIGNATURE-----





reply via email to

[Prev in Thread] Current Thread [Next in Thread]