Flex默认规则

use*_*329 2 c lex tokenize flex-lexer

如何自定义flex的默认操作.我找到了类似<*>的东西,但是当我运行它时会说"flex scanner被卡住"?还有.规则只添加一个规则,因此它也不起作用.我想要的是

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

%%
{comment}             return 1;
{default}             return 0; 
<<EOF>>               return -1;
Run Code Online (Sandbox Code Playgroud)

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

default               (.|\n)*
Run Code Online (Sandbox Code Playgroud)

但因为这几乎总是给出一个更长的匹配,它将隐藏评论规则.

编辑

我在手册中找到了{ - }运算符,但是这个直接来自手册的例子给了我"未记录的规则":

[AC] { - } [BZ]

Kaz*_*Kaz 6

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

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

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

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

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

无论如何,通常在丢弃坏字符时,你想为这种情况发出一条错误信息,比如"在第42行,第3列中跳过无效字符'〜".

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

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

 "foo" { printf("bar"); }
Run Code Online (Sandbox Code Playgroud)

将实现相当于

 sed -e 's/foo/bar/g'
Run Code Online (Sandbox Code Playgroud)