gpt4 book ai didi

c - 弹性默认规则

转载 作者:太空狗 更新时间:2023-10-29 14:49:11 25 4
gpt4 key购买 nike

如何自定义 flex 的默认操作。我发现了类似 <*> 的东西,但是当我运行它时它说“flex scanner jammed”?还有 . rule 仅添加一条规则,因此它也不起作用。我想要的是

comment               "/*"[^"*/"]*"*/"

%%
{comment} return 1;
{default} return 0;
<<EOF>> return -1;

是否可以将匹配最长的行为更改为最先匹配?如果是这样,我会做这样的事情

default               (.|\n)*

但是因为这几乎总是给出更长的匹配,所以它会隐藏评论规则。

编辑

我在手册中找到了 {-} 运算符,但是这个直接来自手册的示例给了我“无法识别的规则”:

[a-c]{-}[b-z]

最佳答案

flex 默认规则匹配单个字符并将其打印在标准输出上。如果您不想执行该操作,请编写一个匹配单个字符并执行其他操作的显式规则。

模式 (.|\n)* 将整个输入文件作为单个标记进行匹配,因此这是一个非常糟糕的主意。您认为默认值应该是长匹配,但实际上您希望它尽可能短(但不是空的)。

默认规则的目的是在输入语言中的任何标记都不匹配时执行某些操作。当 lex 用于标记语言时,这种情况几乎总是错误的,因为这意味着输入的开头字符不是该语言任何有效标记的开头。

因此,“捕获任何字符”规则被编码为一种错误恢复形式。这个想法是丢弃坏字符(只有一个)并尝试从那个字符之后的字符进行标记化。这只是一个猜测,但它是一个很好的猜测,因为它是基于已知的:即输入中有一个坏字符。

恢复规则可能是错误的。例如,假设该语言没有以@ 开头的标记,而程序员想要编写字符串文字"@abc"。只是,她忘了开头的",写了@abc"。正确的解决方法是插入缺失的 ",而不是丢弃 @。但这需要词法分析器中的一组更聪明的规则。

无论如何,通常在丢弃坏字符时,您想针对这种情况发出错误消息,例如“在第 42 行第 3 列跳过无效字符'~`”。

将不匹配的字符复制到标准输出的默认规则/操作在 lex 用于文本过滤时很有用。然后默认规则带来正则表达式搜索的语义(与正则表达式匹配相反):想法是搜索输入以查找词法分析器的标记识别状态机的匹配项,同时打印该搜索跳过的所有 Material 。

例如,一个仅包含规则的 lex 规范:

 "foo" { printf("bar"); }

将实现等同于

 sed -e 's/foo/bar/g'

关于c - 弹性默认规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58416293/

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