Lex如何模拟模式或一堆上下文

时间:2017-09-10 04:56:48

标签: c lex

我正试图弄清楚如何在lex(flex)中模拟上下文/模式或“堆栈上下文”。

特别是,我想编写一个解析器,它具有字符串文字的概念,可以让你回到表达式上下文中。

我有一个简单的语法,它使用语法'...'支持原始字符串文字,并在找到字符串时输出字符串。

但是,字符串标记的长度可能无限制(最多为lex的最大缓冲区大小,我认为这是在生成的C源中的某些宏中定义的)。

我想定义一个begin_string令牌'和一个end_string令牌'以及一个用于在字符串内读取字符的独特令牌。

我希望通过一些上下文的概念来实现这一目标,即“现在我在一个字符串中”并影响哪些标记化规则是“活动的”。

以下是上下文中的天真语法。

%{ 

#include <stdio.h>

%}

%option noyywrap

%%

'[^']*' { printf("found string literal (( %s ))\n", yytext); }

\n { /* do nothing */ }
. { /* do nothing */ }

%%

int main()
{
    yylex();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的需求,则start conditions会提供该功能。如手册所述,开始条件是一种状态,可用于启用和禁用一组制作。

例如,您可能有:

%option nodefault
%x IN_STRING

%%
 /* Other patterns for regular tokens */
"'"               { BEGIN(IN_STRING); return BEGIN_STRING; }
<IN_STRING>"'"    { BEGIN(INITIAL);   return END_STRING; }
<IN_STRING>.|\n   {                   return STRING_CHAR; }

Flex可选择启用一项功能,允许您在堆栈上推送和弹出当前启动条件,但在这种简单的情况下,这是不必要的。如果您确实需要这样做,请记住将%option stack添加到您的序言中,并阅读上面链接的“开始条件”一章末尾的API说明。