尝试匹配在flex中使用“递归”标识符的规则

时间:2012-01-11 13:54:14

标签: 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(#)

}

当这一部分开始时,我必须为每一行创建一个结构,我把它放在左边的 - >在向量中,这些是一些参数,在列表中是右侧,其中每个术语都是另一种结构。对于右边的内容,我写了规则:

对于W(任何事物),

writex W([a-zA-Z0-9。#])。

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

带有param = a的新bigStruc和struct = W(任何东西)的列表,#invert(它是对另一个结构的引用的表示法)

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

对不起我的英语,我希望这次我对自己的想法更加清楚。

最后一分钟编辑:我已将整条线与规则匹配,然后使用strtok进行处理。有一种方法可以使用以前的规则来查看我必须创建的结构类型?我的意思是不留下并且放了很多if,但是使用writex W([a-zA-Z0-9。#])知道我必须创建那种结构?

1 个答案:

答案 0 :(得分:0)

好的,让我们看看这个代码段如何为您服务:

// 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
%%

我不完全确定你想要的是什么。编辑原始帖子以包含评论内容和示例,请更好地构建您的英语。如果你无法解释自己想要什么而不与自己发生矛盾,我无法帮助你。