c - 尝试在 Flex 中使用 "recursive"标识符的规则进行匹配

标签 c flex-lexer

我有这一行:

0, 6 -> W(1) L(#);

\# -> @shift_right R W(1) L

我必须用 flex 解析这一行,并从箭头的每个部分获取每个元素并将其放入列表中。我知道如何匹配简单的事物,但我不知道如何使用相同的规则匹配多个事物。我不允许增加规则的限制。我有一个提示:解析这些片段,然后片段将组合起来,我可以使用状态,但我不知道该怎么做,而且我在网上找不到示例。有人可以帮助我吗?

所以,这里有一个例子:

{

a -> W(b) #invert_loop;

b -> W(a) #invert_loop;

-> L(#)

}

当本节开始时,我必须为每一行创建一个结构,我将 -> 左侧的内容放入 vector 中,这些是一些参数,列表的右侧,其中每个术语都有点另一个结构。对于右侧的内容,我编写了规则:

writex W([a-zA-Z0-9.#]) 代表 W(任何东西)。

所以我需要解析这些行,这样我就可以将参数和结构放入大结构中。像这样的东西(第一行):

带有 param = a 和 struct = W(anything) 列表的新 bigStruc,#invert(这是引用另一个结构的符号)

所以我需要的是知道如何解析这些行,以便我可以创建和填充这些 bigStruct,还使用简单结构的规则(我拥有这些结构所需的所有内容,但我不知道如何解析以便我可以使用这些方法)。

抱歉我的英语不好,我希望这次我更清楚我想要什么。

最后一刻的编辑:我已经将整行与规则进行了匹配,然后使用 strtok 对其进行处理。有一种方法可以使用以前的规则来查看我必须创建什么类型的结构?我的意思是不要留下来并放置大量 if,而是使用 writex W([a-zA-Z0-9.#]) 来知道我必须创建这种结构?

最佳答案

好的,让我们看看这个代码片段如何为您工作:

// these are exclusive rules, so they do not overlap, for inclusive rules, use %s
%x dataStructure
%x addRules
%%
<dataStructure>-> { BEGIN addRules; }
\{                { BEGIN dataStructure; }
<addRules>;       { BEGIN dataStructure; }
<dataStructure>\} { BEGIN INITIAL; }

<dataStructure>[^,]+ { ECHO; } //this will output each comma separated token
<dataStructure>. { } //ignore anything else
<dataStructure>\n { } //ignore anything else
<addRules>[^ ]+ { ECHO; } //this will output each space separated rule
<addRules>. { } //ignore anything else
<addRules>\n { } //ignore anything else
%%

我不完全确定你想要什么。编辑您的原始帖子以包含您的评论内容和示例,并请更好地组织您的英语。如果你无法在不自相矛盾的情况下解释你想要什么,我无法帮助你。

关于c - 尝试在 Flex 中使用 "recursive"标识符的规则进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8820424/

相关文章:

c++ - Bison 和用户类 : compiling error

c++ - 在 BST 中找到小于 K 的最大元素

c - 将地址存储为值并稍后在指针上使用它

更改 argp 上的默认输出流

bison - 弯曲 : input rules are too complicated (>= 32000 NFA states) (while compiling HLA on 62bit)

c - 如何使 flex 使用包含文本的文件(.txt/.c/等)作为其输入

c - C 中的字符串操作,语法正确,但不适用于 MacOS 或 freeBSD

c++ - c/c++中的DNS查询

c - 如何初始化 Bison 的 %union 值?

Bison 不创建 tab.h 文件