Regex 使用Flex Bison提取标记之间的数据
作为Flex Bison的先发球员,我遇到了第一个障碍,似乎找不到出路 问题陈述:对于给定的html/xml文件,需要在标记之间提取数据。我已经阅读了关于SO的相关问题,但似乎没有触及这个问题的最佳点 (因为这是为了学习如何使用flex bison,所以我不想转而使用任何其他语言/工具) 输入文件包含以下要提取的字段:Regex 使用Flex Bison提取标记之间的数据,regex,grammar,bison,flex-lexer,lex,Regex,Grammar,Bison,Flex Lexer,Lex,作为Flex Bison的先发球员,我遇到了第一个障碍,似乎找不到出路 问题陈述:对于给定的html/xml文件,需要在标记之间提取数据。我已经阅读了关于SO的相关问题,但似乎没有触及这个问题的最佳点 (因为这是为了学习如何使用flex bison,所以我不想转而使用任何其他语言/工具) 输入文件包含以下要提取的字段: //标签之间的相关数据 我编写了以下扫描仪测试 %option noyywrap %{ #include "parser.tab.h" %} %% "<!--<l
//标签之间的相关数据
我编写了以下扫描仪测试
%option noyywrap
%{
#include "parser.tab.h"
%}
%%
"<!--<legend>" {return name1;}
(.*?) {yylval.sval=strdup(yytext); return name2;}
"<\/legend>" {return name3;}
%%
然而,在执行程序时,我得到以下错误:
EEK,解析错误!消息:**语法错误,意外名称2,预期名称1
***
我理解读到的错误是asname2
token可以无限匹配,而且它出现在grammar中预期的tokenname1
之前
我的问题是,既然我已经定义了语法,首先查找name1,然后查找name2,然后查找name3标记,那么为什么会出现这个错误呢
如果我在扫描器中仅将一个令牌name1
定义为
<!--<legend>(.*?)<\/legend> {return name1;}
出现问题的原因是您只为输入文件的一部分定义了规则,希望词法分析器和解析器忽略其余部分。这不是工具的工作原理;它们尝试匹配所有内容,因此您必须为输入数据的每个方面定义所有内容 我还注意到,您最初的lexer文件并没有使用flex构建。你的规则顺序不对。您的原始规则集包括:
%选项noyywrap
%{
#包括“parser.tab.h”
%}
%%
“//re
标签之间的黎凡特数据“)
EEK,解析错误!消息:语法错误,意外名称2,应为名称1
我们遇到了另一个问题。神秘的是,为什么它不匹配并返回
name1
?这是因为匹配算法是贪婪的,并找到与最长令牌匹配的规则。为了克服这个问题,我们必须使用flex的特性,并且只在
结构中匹配一般文本。在match XML中使用开始条件时,我们必须小心,因为出现问题的原因是您只为输入文件的一部分定义了规则,希望词法分析器和解析器忽略其余部分。这不是工具的工作原理;它们尝试匹配所有内容,因此您必须为输入数据的每个方面定义所有内容
我还注意到,您最初的lexer文件并没有使用flex构建。你的规则顺序不对。您的原始规则集包括:
%选项noyywrap
%{
#包括“parser.tab.h”
%}
%%
“//re
标签之间的黎凡特数据“)
EEK,解析错误!消息:语法错误,意外名称2,应为名称1
我们遇到了另一个问题。神秘的是,为什么它不匹配并返回
name1
?这是因为匹配算法是贪婪的,并找到与最长令牌匹配的规则。为了克服这个问题,我们必须使用flex的特性,并且只在
结构中匹配一般文本。在match XML中使用开始条件时,我们必须小心,因为非常感谢!如何打开flex调试?找到它(:必须编译flex而不使用-d选项。非常感谢!如何打开flex调试?找到它(:必须编译flex而不使用-d选项)。
all: compile_run
compile_run:
@bison -d parser.y
@flex test.l
@gcc parser.tab.c lex.yy.c -lfl -o run
<!--<legend>(.*?)<\/legend> {return name1;}
%option noyywrap
%{
#include "parser.tab.h"
%}
%%
"<!--<legend>" {return name1;}
"<\/legend>" {return name3;}
(.*?) {yylval.sval=strdup(yytext); return name2;}
%%
bison -d parser.y
flex -d test.l
gcc parser.tab.c lex.yy.c -lfl -o run