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

问题描述:

我在写一个lex脚本来标记C AST。我想在lex中编写一个正则表达式来得到一个以特定字符串“lngt”结尾但在lex返回的最终字符串中不包含“lngt”的字符串。所以基本上字符串形式将是(。* lngt),但我一直无法弄清楚如何在lex中执行此操作。任何意见/方向将是很有益在Lex中获取以字符串“lngt”结尾的字符串

例子:我有这个线在我的文件

@65 string_cst type: @71 strg: Reverse order of the given number is : %d lngt: 42 

我想检索字符串STRG后:和之前lngt:即“在给定数量的反向顺序是: %d“(注意:该字符串可以由任何可能的字符组成)

谢谢。

+0

是否可以发布您的任何代码? – summea

这个问题需要一个答案类似于我写的here。可以通过用lex编写自己的状态机来完成。它也可以通过编写一些如引用的答案或下面引用的其他文本中所示的代码来完成。

如果我们假设你想要的字符串总是在“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 & D.Brown:Lex和Yacc(第二版)
  • MELesk & E.Schmidt:莱克斯 - 一个词法分析器发生器

描述的两种技术是使用Start Conditions到显式指定的状态机,或manual input直接读取字符。