【问题标题】:How to skip parts of bison if yyparse fails如果 yyparse 失败,如何跳过部分野牛
【发布时间】:2021-04-12 19:56:57
【问题描述】:

所以基本上,在我的野牛文件中,如果 yyparse 失败(即存在语法错误),我想打印 'ERROR' 语句,而不是打印我在 fac stmt 部分的野牛文件上述部分中所做的任何其他事情。如果 yyparse 返回 1 有没有办法跳过野牛文件中间部分的内容?比如 idk 可能在 stmt 部分上面写 if 语句等?我将不胜感激任何帮助!提前致谢。

如:

%{
#include "header.h"
#include <stdio.h>


void yyerror (const char *s) 
{}


extern int line;

%}

%token   ...///

%// some tokens types etc...
%union
{
  St class;
  int value;
  char* str;
  int line_num;
float float_value;
}

%start prog


%%
prog:       '[' stmtlst ']'
;

stmtlst:    stmtlst stmt |
;

stmt:       setStmt | if | print | unaryOperation | expr
        {
        if ($1.type==flt && $1.line_num!=0) {
               printf("Result of expression on %d is (",$1.line_num);
        printf( "%0.1f)\n", $1.float_value);
        $$.type=flt;
        }
               else if ($1.type==integer && $1.line_num!=0){
        $$.type=integer;
              printf("Result of expression on %d is (%d)\n",$1.line_num,$1.value);
                }
                else if ($1.type==string && $1.line_num!=0) {
        $$.type=string;
              printf("Result of expression on %d is (%s)\n",$1.line_num,$1.str);
                } 
        else if ($1.type==mismatch && $1.line_num!=0)
                {
        $$.type=mismatch;
                  printf("Type mismatch on %d \n",$1.line_num);

            }
    else{ }
 }
%%

int main ()
{
if (yyparse()) {
// if parse error happens only print this printf and not above stmt part
printf("ERROR\n");
return 1;
}
else {
// successful parsing
return 0;
}
}

【问题讨论】:

标签: c parsing bison yacc


【解决方案1】:

不幸的是,时间旅行不是一种选择。到检测到错误时, printf 调用已经发生。你不能让它们不发生。

您可以这样做(如果您正在编写编译器而不是计算器,则必须这样做)是创建一些代表已解析程序的数据结构,而不是尝试立即执行它。该数据结构——可以是抽象语法树 (AST) 或三地址指令列表,或其他任何东西,将用于生成编译程序。只有当编译的程序运行时才会计算语句。

【讨论】:

  • 谢谢。这是我害怕的答案:D 我虽然创建了一个数组并附加了我想要打印的每个值,最后在 main 中我将使用 printf 语句打印数组的元素但是我同时存储字符串值和整数值,那么应该是什么样的数组我在这里迷路了也许你可以帮忙?谢谢顺便说一句。 @rici
  • @beg:假设您最终想要在您的语言中包含循环,以及读取用户输入等普通内容,您无法随时评估已解析的文本。您必须存储解析文本的结构,而不是评估它的结果。搜索“抽象语法树”和/或“三地址代码”和/或“中间表示”。你会发现很多想法。
  • 另外,你可以尝试通过Structure and Interpretation of Computer Programs 工作。把它想象成一种心理瑜伽:伸展运动。
  • 实际上我所做的并不是一门复杂的语言,我只处理 + - * 等运算符,我只想打印它们的结果,如浮点整数或连接字符串。我猜你的建议比我的更难。不过非常感谢! @rici
  • 语言是一种合成语言。我的目标是 ["+",3,2] 结果是 5 或 ["+", 'Hello','World'] 结果是 HelloWorld 等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2021-10-01
  • 1970-01-01
  • 2020-06-19
  • 2015-10-30
相关资源
最近更新 更多