野牛:获取/存储非终结者的值

时间:2015-10-08 10:17:13

标签: grammar bison yacc flex-lexer

我在Bison写了一个简单的类C语法,我有一个奇怪的问题。

在以下规则中:

declaration:        "identifier" length init_values                      
                    {symbolTable.add($3,$4,$5);}

我想获取lengthinit_values的int值,这些值是非终结符,以将它们存储在符号表中。 identifier是一个标记,其文字值正确存储。但是,我得到一些整数值,如66236273,用于其他符号。

非终结规则是:

length:             "number" {};                         
init_values:        "number" {};

我尝试直接使用令牌而不是非终结符号,但解析器无法区分numberlength,依此类推。它只是将所有整数解析为number,这使它崩溃。

有谁知道如何获得这些的实际价值?即数字值,我能够在最后的规则中找到它,但是当解析器退回到第一条规则时它们会以某种方式丢失。

1 个答案:

答案 0 :(得分:0)

如果没有看到更多的语法和扫描仪定义,很难确定你做错了什么。但这里有一些建议:

  1. {symbolTable.add($3,$4,$5);}与提供的语法规则不一致;它应为{symbolTable.add($1,$2,$3);},因为右侧的值从$1开始从左到右计算。

  2. 假设"identifier"char *"integer"long(或某些此类),所有终端和非终端都必须是使用正确的语义值标记声明。请参阅the bison manual

  3. 不需要length: "number" {};,但由于默认操作实际上是$$ = $1,因此只要length和{"number" declaration: "identifier" "number" "number",就不会造成任何伤害。使用正确的类型标记声明{1}}。我不明白你的意思"我尝试直接使用令牌而不是非终结者"如果它并不意味着你试过yylval;没有理由不这样做(只要类型声明是正确的)。

  4. 如果要在yylval.str = yytext;中传递字符串,请确保复制字符串。 <?php $title = $_POST['search']; echo $title ; $con = mysqli_connect("localhost", "user", "password") or die ('Could not connect, this is the error: ' . mysql_error()); mysqli_select_db($con,"db") or die ('Sorry could not access database at this time. This is the error: ' . mysql_error()); if(isset($_POST['search']){ $searchq = $_POST['search']; $searchq = preg_replace("#[^0-9a-z]#i","",$searchq); $search_sql = "SELECT title FROM gamereview WHERE tags LIKE '%".$_POST['search']."%' "; $search_query = mysqli_query($con, $search_sql) or die("could not search"); $count = mysqli_num_rows($query); if($count==0){ $output = 'THere was no search results!'; } else while ($row = myqli_fetch_array($query, MYSQLI_BOTH)){ $title = $row['title']; $id = $row['id']; $output .= '<div>' .$id.' '.$title.'</div>'; } } echo $output; mysql_close($con); ?> 不正确,会让您遇到麻烦。请参阅this FAQ entry