我正在嘗試為學校作業撰寫一個簡單的 HTTP 請求決議器,但是我遇到了無法擺脫的分段錯誤。我認為我的生產規則還可以。我已經在啟用跟蹤的情況下執行了野牛,它總是在決議我的標頭的部分產生段錯誤:
Reducing stack by rule 9 (line 59):
$1 = token ID ()
$2 = token COLON ()
$3 = token STRING ()
[4] 36661 segmentation fault (core dumped) ./problem1 < input.txt
這是我的 request.l 檔案的內容:
%option noyywrap
%{
#include<stdio.h>
#include "request.tab.h"
char *strclone(char *str);
%}
num [0-9] (\.[0-9]{1,2})?
letter [a-zA-Z]
letternum [a-zA-Z0-9\-]
id {letter}{letternum}*
string \"[^"]*\"
fieldvalue {string}|{num}
%%
(GET|HEAD|POST|PUT|DELETE|OPTIONS) { yylval = strclone(yytext); return METHOD; }
HTTP\/{num} { yylval = strclone(yytext); return VERSION; }
{id} { yylval = strclone(yytext); return ID; }
"/" { return SLASH; }
"\n" { return NEWLINE; }
{string} { yylval = strclone(yytext); return STRING; }
":" { return COLON; }
[ \t\n] ;
. {
printf("Unexpected: %c\nExiting...\n", *yytext);
exit(0);
}
%%
char *strclone(char *str) {
int len = strlen(str);
char *clone = (char *)malloc(sizeof(char)*(len 1));
strcpy(clone,str);
return clone;
}
和我的 request.y 檔案:
%{
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define YYSTYPE char*
extern int yylex();
extern int yyparse();
extern FILE* yyin;
void yyerror(const char* s);
%}
%token METHOD
%token SLASH
%token VERSION
%token STRING
%token ID
%token COLON
%token NEWLINE
%%
REQUEST: METHOD URI VERSION NEWLINE HEADERS {
printf("%s %s", $1, $2);
}
;
URI: SLASH DIR {
$$ = (char *)malloc(sizeof(char)*(1 strlen($2) 1));
sprintf($$, "//%s", $2);
}
;
DIR: ID SLASH {
$$ = (char *)malloc(sizeof(char)*(strlen($1) 2));
sprintf($$, "%s//", $1);
}
|ID {
$$ = $1;
}
| {
$$ = "";
}
;
HEADERS: HEADER {
$$ = $1;
}
|HEADER NEWLINE HEADERS {
$$ = (char *)malloc(sizeof(char)*(strlen($1) 1 strlen($3) 1));
sprintf($$, "%s\n%s", $1, $3);
}
|{
$$ = "";
}
;
HEADER: ID COLON STRING {
$$ = (char *)malloc(sizeof(char)*(strlen($1) 1 strlen($2) 1));
sprintf($$, "%s:%s", $1, $3);
}
;
%%
void yyerror (char const *s) {
fprintf(stderr, "Poruka nije tacna\n");
}
int main() {
yydebug = 1;
yyin = stdin;
do {
yyparse();
} while(!feof(yyin));
return 0;
}
這也是我作為輸入傳遞的 input.txt 的內容:
GET / HTTP/1.1
Host: "developer.mozzila.org"
Accept-language: "fr"
uj5u.com熱心網友回復:
在 中request.y,您包含指令
#define YYSTYPE char*
所以在 Bison 生成的決議器代碼yylval中,型別為char*. 但是那條線沒有插入到request.l. 所以在 Flex 生成的掃描器代碼中,yylval有它的默認型別,int.
您可以通過將定義添加YYSTYPE到request.l檔案來解決此問題,但隨后您在兩個地方重復了相同的設定,這是災難的根源。相反,使用 Bison 的宣告語法:
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406080.html
標籤:
上一篇:將第二個索引后的所有位歸零
下一篇:如何將指標移到開頭?
