【问题标题】:Why does my "equation" grammar break the parser?为什么我的“方程式”语法会破坏解析器?
【发布时间】:2019-03-25 03:45:07
【问题描述】:

目前,我的解析器文件如下所示:

%{

#include <stdio.h>
#include <math.h>

int yylex();
void yyerror (const char *s);

%}

%union {
    long num;
    char* str;
}

%start line

%token print
%token exit_cmd

%token <str> identifier
%token <str> string
%token <num> number

%%

line: assignment            {;}
    | exit_stmt             {;}
    | print_stmt            {;}
    | line assignment       {;}
    | line exit_stmt        {;}
    | line print_stmt       {;}
    ;

assignment: identifier '=' number       {printf("Assigning var %s to value %d\n", $1, $3);}
          | identifier '=' string       {printf("Assigning var %s to value %s\n", $1, $3);}
          ;

exit_stmt: exit_cmd         {exit(0);}
         ;

print_stmt: print print_expr      {;}
          ;

print_expr: string          {printf("%s\n", $1);}
          | number          {printf("%d\n", $1);}
          ;

%%

int main(void)
{
    return yyparse();

}

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

给出输入:myvar = 3 给出输出Assigning var myvar = 3 to value 3,正如预期的那样。但是,修改代码以包含 equation 语法规则会破坏此类分配。

方程语法:

equation: number '+' number             {$$ = $1 + $3;}
    | number '-' number             {$$ = $1 - $3;}
    | number '*' number             {$$ = $1 * $3;}
    | number '/' number             {$$ = $1 / $3;}
    | number '^' number             {$$ = pow($1, $3);}
    | equation '+' number           {$$ = $1 + $3;}
    | equation '-' number           {$$ = $1 - $3;}
    | equation '*' number           {$$ = $1 * $3;}
    | equation '/' number           {$$ = $1 / $3;}
    | equation '^' number           {$$ = pow($1, $3);}
    ;

相应地修改赋值语法:

assignment: identifier '=' number       {printf("Assigning var %s to value %d\n", $1, $3);}
          | identifier '=' equation     {printf("Assigning var %s to value %d\n", $1, $3);}
          | identifier '=' string       {printf("Assigning var %s to value %s\n", $1, $3);}
          ;

并在解析器的第一部分为 equation 规则提供 num 的类型:

%type <num> equation

给出相同的输入:var = 3 冻结程序。

我知道这是一个很长的问题,但谁能解释一下这里发生了什么?

另外,here's the lexer 以防你想看看。

【问题讨论】:

    标签: parsing bison flex-lexer yacc lex


    【解决方案1】:

    它不会“冻结程序”。该程序正在等待更多输入。

    在您的第一个语法中,var = 3 是一个无法扩展的完整语句。但是在你的第二个语法中,它可能是 var = 3 + 4 的开头,例如。所以解析器需要在3之后读取另一个token。如果您希望输入行由换行符终止,您需要修改扫描仪以发送换行符作为标记,然后修改语法以在每个语句的末尾期望换行标记。如果您打算让语句分布在多行中,则需要在输入时注意这一事实。

    您的语法和解析器都存在一些问题。 (例如,Flex 没有实现非贪婪重复。)请查看 bison 和 flex 手册中的示例

    【讨论】:

      猜你喜欢
      • 2013-02-28
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      相关资源
      最近更新 更多