我有一个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。我知道此代码有很多其他问题(缺少递归,正则表达式错误等),但这只是为了重现性。