为什么$ 1与整个分组而不是其令牌匹配?

时间:2019-03-26 03:02:54

标签: parsing bison flex-lexer yacc

我有一个Yacc语法文件:

%{
#include <stdio.h>

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

%}

%union {
    char* str;
}

%start line

%token <str> identifier string

%%

line: assignment    {;}
    ;

assignment: identifier '=' string   {printf("Assigning %s to val %s", $1, $3);}
          ;

%%

int main(void)
{
    return yyparse();
}

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

和一个lex文件:

%{
    #include "y.tab.h"
    void yyerror (char *s);
    int yylex();

    int numlines = 0;
%}

%%

    /* Whitespace */
[ \t\n]            ;

    /* Comments */
\/\/.*$       ;

[a-zA-Z\_][a-zA-Z0-9\_]* {yylval.str = yytext; return identifier;}
[\'\"].*?[\'\"]          {yylval.str = yytext; return string;}

[\=\-\+\/\*\^]     return yytext[0];

.                  {fprintf(stderr, "Unexpected character `%s` \n", yytext);}

%%

int yywrap(void) {return 1;}

当我使用输入var = "some string"运行解析器时,它输出:Assigning var = "some string" to val "some string"

$1为什么匹配整个分配而不仅仅是var

P.S。我知道此代码有很多其他问题(缺少递归,正则表达式错误等),但这只是为了重现性。

0 个答案:

没有答案