C 野牛解析
我从O'Reilly那里购买了Flex&Bison,但是我在实现解析器时遇到了一些问题(将事物分解成标记并不是什么大问题) 假设我有一个巨大的二进制字符串,我需要做的是将这些位相加-每一位都是一个令牌:C 野牛解析,c,yacc,bison,C,Yacc,Bison,我从O'Reilly那里购买了Flex&Bison,但是我在实现解析器时遇到了一些问题(将事物分解成标记并不是什么大问题) 假设我有一个巨大的二进制字符串,我需要做的是将这些位相加-每一位都是一个令牌: [0-1] { return NUMBER;} 110101011111 或者是一个没有“操作”的令牌集合 这样的语法正确吗 calclist : | calclist expr EOL {eval($2)} expr: NUMBER |expr NUMBER
[0-1] { return NUMBER;}
110101011111
或者是一个没有“操作”的令牌集合
这样的语法正确吗
calclist :
| calclist expr EOL {eval($2)}
expr: NUMBER
|expr NUMBER { $$=$1+$2 }
或者有更好的方法吗?您的示例lex规则“[0-1]{return NUMBER;}”没有设置yylval,因此如果您在语法中使用该值(就像您在规则“expr NUMBER{$$=$1+$2;}”中所做的那样),您将得到垃圾
总的来说,你所做的是正确的,尽管你选择的任务很琐碎,lex/bison是严重的滥杀。这不是任务,我只是更容易这么说:)@codenewbie-他是对的,尽管如此。请仔细注意他的第一段,注意你可能想要“
$$=$1*2+$2
将位累积为二进制数。+1用于编写左递归规则