我正在编写一个lex脚本来标记化C AST。我想在lex中编写一个正则表达式来获取一个以特定字符串“lngt”结尾但在lex返回的最终字符串中不包含“lngt”的字符串。所以基本上字符串形式将是(。* lngt),但我还是无法弄清楚如何在lex中执行此操作。任何建议/方向都会非常有帮助
示例:我的文件中有这一行
@65 string_cst type: @71 strg: Reverse order of the given number is : %d lngt: 42
我想在strg之后检索字符串:在lngt之前:即“给定数字的反向顺序为:%d”(注意:此字符串可以由任何可能的字符组成)
感谢。
答案 0 :(得分:0)
这个问题的答案与我写的here类似。可以通过在lex中编写自己的状态机来完成。也可以通过编写一些 C 代码来完成,如引用的答案或下面引用的其他文本中所示。
如果我们假设您想要的字符串始终在“strg”和“lngt”之间,那么这与任何其他非对称字符串分隔符相同。
%x STRG LETTERL LN LNG LNGT
ws [ \t\r\n]+
%%
<INITIAL>"strg: " {
BEGIN(STRG);
}
<STRG>[^l]*l {
yymore();
BEGIN(LETTERL);
}
<LETTERL>n {
yymore();
BEGIN(LN);
}
<LN>g {
yymore();
BEGIN(LNG);
}
<LNG>t {
yymore();
BEGIN(LNGT);
}
<LNGT>":" {
printf("String is '%s'\n", yytext);
BEGIN(INITIAL);
}
<LETTERL>[^n] {
BEGIN(STRG);
yymore();
}
<LN>[^g] {
BEGIN(STRG);
yymore();
}
<LNG>[^t] {
BEGIN(STRG);
yymore();
}
<LNGT>[^:] {
BEGIN(STRG);
yymore();
}
<INITIAL>{ws} /* skip */ ;
<INITIAL>. /* skip anything not in the string */
%%
引用我的另一个答案:
有几个大学编译课程的建议解决方案。解释得很好的是here (at Manchester)。其中引用了几本也涵盖问题的好书:
- J.Levine,T.Mason&amp; D.Brown:Lex和Yacc(第2版)
- M.E.Lesk&amp; E.Schmidt:Lex - 词汇分析器生成器
所描述的两种技术是使用Start Conditions明确指定状态机,或manual input直接读取字符。