Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Lex如何模拟模式或上下文堆栈_C_Lex - Fatal编程技术网

C Lex如何模拟模式或上下文堆栈

C Lex如何模拟模式或上下文堆栈,c,lex,C,Lex,我试图弄清楚如何在lex(flex)中模拟上下文/模式或“上下文堆栈” 特别是,我想编写一个解析器,它具有字符串文本的概念,可以将您放回到expression-y上下文中 我有一个简单的语法,它使用语法“…”支持原始字符串文本,并在找到字符串时打印它 然而,字符串标记具有潜在的无限长度(高达lex的最大缓冲区大小,我认为它是在生成的C源代码中的某个宏中定义的) 我想定义一个begin\u stringtoken'和一个end\u stringtoken'以及一个独特的标记,用于在字符串中读取字符

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

特别是,我想编写一个解析器,它具有字符串文本的概念,可以将您放回到expression-y上下文中

我有一个简单的语法,它使用语法
“…”
支持原始字符串文本,并在找到字符串时打印它

然而,字符串标记具有潜在的无限长度(高达lex的最大缓冲区大小,我认为它是在生成的C源代码中的某个宏中定义的)

我想定义一个
begin\u string
token
'
和一个
end\u string
token
'
以及一个独特的标记,用于在字符串中读取字符

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

下面是上下文的朴素语法

%{ 

#include <stdio.h>

%}

%option noyywrap

%%

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

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

%%

int main()
{
    yylex();
    return 0;
}
%{
#包括
%}
%选项No yywrap
%%
'[^']*'{printf(“找到字符串文字((%s))\n”,yytext);}
\n{/*什么都不做*/}
. {/*什么也不做*/}
%%
int main()
{
yylex();
返回0;
}

如果我正确理解您的需求,该功能将随附。如手册所述,启动条件是一种状态,可用于启用和禁用一组产品

例如,您可能有:

%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; }
%option nodefault
%字符串中的x
%%
/*常规令牌的其他模式*/
“{BEGIN(在字符串中);返回BEGIN\u字符串;}”
“{BEGIN(INITIAL);返回END_STRING;}”
.|\n{返回字符串_CHAR;}
Flex将可选地启用一个功能,允许您在堆栈上推送和弹出当前的启动条件,但在这个简单的情况下,这不是必需的。如果确实需要这样做,请记住在序言中添加
%选项堆栈
,并阅读上面链接的开始条件一章末尾的API说明。

您看过了吗?如果我理解你的问题,那就是你想要的(尽管我可能没有完全理解你的需求)。如果您使用flex,顺便说一句,对令牌没有任意限制;缓冲区将被扩展,直到malloc拒绝提供更多空间。