我在Bison写了一个简单的类C语法,我有一个奇怪的问题。
在以下规则中:
declaration: "identifier" length init_values
{symbolTable.add($3,$4,$5);}
我想获取length
和init_values
的int值,这些值是非终结符,以将它们存储在符号表中。 identifier
是一个标记,其文字值正确存储。但是,我得到一些整数值,如66236273,用于其他符号。
非终结规则是:
length: "number" {};
init_values: "number" {};
我尝试直接使用令牌而不是非终结符号,但解析器无法区分number
和length
,依此类推。它只是将所有整数解析为number
,这使它崩溃。
有谁知道如何获得这些的实际价值?即数字值,我能够在最后的规则中找到它,但是当解析器退回到第一条规则时它们会以某种方式丢失。
答案 0 :(得分:0)
如果没有看到更多的语法和扫描仪定义,很难确定你做错了什么。但这里有一些建议:
{symbolTable.add($3,$4,$5);}
与提供的语法规则不一致;它应为{symbolTable.add($1,$2,$3);}
,因为右侧的值从$1
开始从左到右计算。
假设"identifier"
是char *
且"integer"
是long
(或某些此类),所有终端和非终端都必须是使用正确的语义值标记声明。请参阅the bison manual。
不需要length: "number" {};
,但由于默认操作实际上是$$ = $1
,因此只要length
和{"number"
declaration: "identifier" "number" "number"
,就不会造成任何伤害。使用正确的类型标记声明{1}}。我不明白你的意思"我尝试直接使用令牌而不是非终结者"如果它并不意味着你试过yylval
;没有理由不这样做(只要类型声明是正确的)。
如果要在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。