莱克斯如何模拟模式或上下文
问题描述:
我试图找出如何以模拟法(弯曲)上下文/模式或“上下文的栈”的堆栈。莱克斯如何模拟模式或上下文
我特别想写出具有字符串文字,可以送你回一个表达式-Y上下文的概念解析器。
我有一个简单的语法,它支持使用语法'...'
原始字符串字面量,当它找到一个打印字符串。
但是,字符串标记的长度可能是无限的(达到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;
}
答
如果我正确理解您的需求,该功能具备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的说明。
你看过[开始条件](http://westes.github.io/flex/manual/Start-Conditions.html)吗?如果我理解你的问题,那就是你正在寻找的东西(尽管可能我完全不了解你的需求)。如果您使用flex,顺便说一下,令牌不存在任意限制;缓冲区将被扩展,直到malloc拒绝提供更多空间。 – rici