我正试图弄清楚如何在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;
}
答案 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说明。