Regex 使用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

作为Flex Bison的先发球员,我遇到了第一个障碍,似乎找不到出路

问题陈述:对于给定的html/xml文件,需要在标记之间提取数据。我已经阅读了关于SO的相关问题,但似乎没有触及这个问题的最佳点

(因为这是为了学习如何使用flex bison,所以我不想转而使用任何其他语言/工具)

输入文件包含以下要提取的字段:


//标签之间的相关数据
我编写了以下扫描仪测试

%option noyywrap
%{
#include "parser.tab.h"
%}
%%
"<!--<legend>"  {return name1;}
(.*?)   {yylval.sval=strdup(yytext); return name2;}
"<\/legend>" {return name3;}
%%
然而,在执行程序时,我得到以下错误:

EEK,解析错误!消息:**语法错误,意外名称2,预期名称1
***

我理解读到的错误是as
name2
token可以无限匹配,而且它出现在grammar中预期的token
name1
之前

我的问题是,既然我已经定义了语法,首先查找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