【问题标题】:Exponential Expression Flex/Bison指数表达式 Flex/Bison
【发布时间】:2014-01-31 20:45:33
【问题描述】:

我正在用 Flex/Bison 制作一个基本计算器,我想做指数 (^),但我目前的实现不起作用,谁能告诉我为什么不能以及如何解决它?

%{
    #include <stdio.h>
    #include <math.h>
    void yyerror(char *);
    int yylex(void);
    int symbol;
%}

%token INTEGER VARIABLE
%left '+' '-' '*' '/' '^'

%%

program:
    program statement '\n'
    | /* NULL */
    ;
statement:
    expression          { printf("%d\n", $1); }
    | VARIABLE '=' expression   { symbol = $3; }
    ;
expression:
        INTEGER

    | VARIABLE          { $$ = symbol; }
    | '-' expression        { $$ = -$2; }
    | expression '+' expression { $$ = $1 + $3; }
    | expression '-' expression { $$ = $1 - $3; }
    | expression '*' expression { $$ = $1 * $3; }
    | expression '/' expression { $$ = $1 / $3; }
    | expression '^' expression { $$ = $1 ^ $3; }
    | '(' expression ')'        { $$ = $2; }
    ;

%%

void yyerror(char *s) {
    fprintf(stderr, "%s\n", s);
}
int main(void) {
    yyparse();
}

谢谢

【问题讨论】:

  • 请注意您的标记; flex 用于 UI 框架; Flex-lexer 用于词法分析器。
  • 取幂运算符是右关联的,而不是左关联的。

标签: compiler-construction bison flex-lexer exponential


【解决方案1】:

^ 不是 C 中的指数运算符;这是异或。您需要使用数学库函数pow 或编写自己的整数求幂函数。

【讨论】:

  • 好的,现在它给了我一个“未定义的 pow 引用”,但我已经包含了
  • 我明白了。显然您必须使用标志 -lm 进行编译。除了制作makefile还有什么办法吗?
  • @Nelson.b.austin:您可以记住每次编译时都输入-lm,但make 实用程序是为这类事情设计的,所以我推荐它。请注意,您实际上并不需要生成文件;您只需设置环境变量 LDLIBS:export LDLIBS=-lm。然后默认的make 规则应该可以工作,尽管它可能不是你想要的构建方式。 (如果你还需要编译你的 flex 文件,你需要一个真正的 makefile。)
【解决方案2】:

我认为这可行

 $$=pow($1,$3);

更多详情请参考:http://www-h.eng.cam.ac.uk/help/tpl/languages/flexbison/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2013-10-24
    • 2011-07-11
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多