help-bison
[Top][All Lists]
Advanced

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

Re: [help-bison]How to stock information?


From: Hans Aberg
Subject: Re: [help-bison]How to stock information?
Date: Wed, 20 Jul 2005 10:34:25 +0200

On 20 Jul 2005, at 07:49, soledady wrote:

can i construct a top-down grammar?

It isn't the grammar that is top-down or not -- it is the parse tree that one build. The Bison generated parser builds it bottom-up, because Bison uses LALR(1). The other method is LL(k). In Bison, one sometimes has to introduce a global variable, which carries some semantic information. That is essentially a top-down construct.


For example, if you have a rule
term:
   term "+" term {...}
then $1, $2, and $3 will be used to assign values to the RHS
occurrences of "term", which can be forwarded to the LHS by the use
of $$. If you let $$ be the root of a tree, and $1, $2 and $3 be
branches attached to $$, you get a syntax tree:
         $$
      /  |  \
     $1  $2  $3


 the $$ could be use again in other rule couldn't it?

Every rule and token has its own semantic value, represented locally in the rule actions by the symbol $$.

just a precision what the meaning of RHS and LHS(Right...? and Left
something?)

See
  http://en.wikipedia.org/wiki/LHS
  http://en.wikipedia.org/wiki/RHS





so for this part of an example (without all the rest of the example)
U{N}=U{N-1}+3*U{N-2}; U{0}=1; U{1}=2;
it's give me:
*3+    ;  1  2   =U{1}=U{0} U{n-2} U{n-1}    =U{N}


how can i do to recover correctly which number for which part of
code ?


My guess is that you ask for the semantic value. It will be held in
the variables $$ and $k.



ok but how can i do to know that *3+ means +3*
and to know which kind of term (u(n) or u(n+1) and so on...) are in use

Yo define a grammar, just as you already have started, and then in each action you have the input semantic values $1, $2, ..., $k, where k is the rule length, and then you use them to define a value of $$. Bison generates a parser that makes sure that his hangs together.


statement:
   "{" statement_body "}"

statement_body: /* Builds "u(n)=u(n-1)+3*u(n-2);u{0}=1;u{1}=2;" */


yes but how can i built this expression

You have to build a grammar. This is difficult at firts. The Bison manual has a calculator example. The book by Aho, Sethi, Ullman, "Compilers" (the "dragon book") has an example of using Lex and Yacc. Look in grammar-like BNF notation of already existing computer languages, as that of the C/C++ standards. The newsgroup comp.compilers has a FAQ, published there monthly, which you can look into.

  Hans Aberg






reply via email to

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