gpt4 book ai didi

c++ - Flex/Bison Markdown 到 HTML 程序

转载 作者:行者123 更新时间:2023-11-28 04:06:12 25 4
gpt4 key购买 nike

这是家庭作业。我自己编辑的唯一代码是定义、规则和标记。到目前为止,我已经成功编译,但是当我尝试在 markdown 文件 (.md) 上运行它时出现段错误,因此 HTML 输出只是一个空白文件。

%{
#define YYSTYPE char *
#include <string.h>
#include "miniMD2html.tab.h"
extern YYSTYPE yylval;
%}
%option yylineno

/* Flex definitions */
whitespace [ \t]+
newline [\n]+|{whitespace}[\n]+
textword [a-zA-Z:/.\-,\']+
integer [0-9]+
header #|##|###|####|#####

%%
{header} { return T_HEADER; }
{integer} { return T_INTEGER; }
{textword} { return T_TEXTWORD; }
{whitespace} { return T_BLANK; }
{newline} { return T_NEWLINE; }
%%

生成函数在另一个文件中给出。大部分只是接受char*,generate_header函数接受一个int和char*,generate_image函数接受两个char*和两个int。语法可能看起来很奇怪,但这就是作业中给出的内容。

%{
#include "global.h"
#include "stdlib.h"
#include "stdio.h"
#define YYSTYPE char *
extern int yylex();
int yywrap();
int yyerror(const char*);
int yyparse();
extern FILE *yyin;
Html_Doc *html_doc;
%}

/* Define tokens here */
%token T_BLANK T_NEWLINE
%token T_HEADER T_INTEGER T_TEXTWORD

%% /* Grammar rules and actions follow */
s: mddoc;
mddoc: /*empty*/ | mddoc paragraph;
paragraph: T_NEWLINE {add_linebreak(html_doc);}
| pcontent T_NEWLINE {add_element(html_doc, $1); free($1);} ;
pcontent: header
| rftext {generate_paragraph($1);}
header: T_HEADER T_BLANK rftext {generate_header(strlen($1), $3);}
rftext: rftext T_BLANK rftextword {strappend($1, $3);}
| rftext rftextword {strappend($1, $2);}
| rftextword
rftextword: textnum | image | format
image: "![" text "](" text '=' T_INTEGER '@' T_INTEGER ')' {generate_image($2, $4, atoi($6), atoi($8));}
format: "**" text "**" {generate_bold($2);}
| '_' text '_' {generate_italic($2);}
| "**" format "**" {generate_bold($2);}
| '_' format '_' {generate_italic($2);}
text: text T_BLANK textnum {strappend($1, $3);}
| text textnum {strappend($1, $2);}
| textnum
textnum: T_TEXTWORD | T_INTEGER
%%

int main(int argc, char *argv[]) {
// yydebug = 1;

FILE *fconfig = fopen(argv[1], "r");
// make sure it is valid
if (!fconfig) {
printf("Error reading file!\n");
return -1;
}
html_doc = new_html_doc();
// set lex to read from file
yyin = fconfig;
int ret = yyparse();
output_result(html_doc);
del_html_doc(html_doc);
return ret;
}

int yywrap(){
return 1;
}

int yyerror(const char* s){
extern int yylineno;
extern char *yytext;
printf("error while parsing line %d: %s at '%s', ASCII code: %d\n", yylineno, s, yytext, (int)(*yytext));
return 1;
}

最佳答案

您的所有 flex 规则都不会设置 yylval 的值,因此它将始终为 NULL。语法中对语义值 ($n) 的所有引用也是如此。由于大多数采用 char* 的函数都假定它是一个有效的字符串,因此很可能其中一个函数很快就会尝试检查字符串值,而指针为 NULL 的事实肯定会导致到段错误。

此外,在您的语法中同时存在单个字符和带引号的字符串标记,您的扫描器无法生成这些标记。因此,一旦在输入中遇到其中一个非单词字符,解析器很可能会因语法错误而停止。

关于c++ - Flex/Bison Markdown 到 HTML 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58689373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com