获取一个以Lex中的字符串“lngt”结尾的字符串

时间:2012-01-21 06:44:28

标签: lex

我正在编写一个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”(注意:此字符串可以由任何可能的字符组成)

感谢。

1 个答案:

答案 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直接读取字符。