2016-05-02 9 views
0

Ich schreibe eine einfache Grammatik für logischen Ausdruck in Flex und Bison. Der Ausdruck ist ein Postfix-Ausdruck. Das ist mein YACC-Code.Logischer Ausdruck Grammatik in Flex und Bison

float_logic_expr: 
       float_logic_expr 
       | float_logic_exprs 
       ; 

float_logic_exprs: 
       float_reln_expr 
      | float_reln_expr float_reln_expr PP_AND      
      | float_reln_expr float_reln_expr PP_OR     
      ; 

string_logic_expr: 
       string_reln_expr 
      | string_reln_expr string_reln_expr PP_AND    
      | string_reln_expr string_reln_expr PP_OR    
      ; 

Die obige Regel funktioniert gut für die folgende Aussage.

if #a 40 > #b 20 == && then 

Aber wenn ich dem logischen Ausdruck eine weitere Bedingung gebe, schlägt es fehl.

if #a 40 > #b 20 == && #b 30 == && then 

Parse-Fehler.

Wie soll ich die Grammatik ändern, um für mehrere relationale Ausdrücke zu arbeiten?

Antwort

0

Es tut, was Sie ihm gesagt haben, oder?

float_logic_exprs 
      : float_reln_expr 
      | float_reln_expr float_reln_expr PP_AND      
      | float_reln_expr float_reln_expr PP_OR     
      ; 

die besagt, dass ein logischer Ausdruck eine einzige Beziehung Ausdruck oder zwei (genau) Beziehung gefolgt Ausdrücke von einem AND oder OR Token. Das von Ihnen angegebene Beispiel zeigt jedoch, dass Sie erwarten, dass ein logischer Ausdruck einen anderen logischen Ausdruck als Argument und nicht nur einen Beziehungsausdruck annehmen kann.

Auch dies ist sinnlos:

float_logic_expr: 
       float_logic_expr 
       | float_logic_exprs 
       ; 

Da die Produktion float_logic_expr: float_logic_expr nicht immer nützlich sein kann (und es muss eine Art von Bison Warnung auslösen).

dass alle sollten vorschlagen, dass Sie wollen:

float_logic_expr 
      : float_reln_expr 
      | float_logic_expr float_logic_expr PP_AND      
      | float_logic_expr float_logic_expr PP_OR     
      ; 
+0

VG. Ich würde sagen, dass AND und OR auf der Ebene oberhalb der Eingabe (float/string) erscheinen sollten. Andernfalls können Sie keine Float-Ausdrücke mit String-Ausdrücken kombinieren. – EJP

+0

@ejp: Ich empfehle normalerweise gegen typisierte Syntax, aber ich war müde, also habe ich es kurz gemacht. Du hast natürlich Recht. Ich könnte am Morgen umschreiben. – rici