2017-09-10 231 views
0

我試圖找出如何以模擬法(彎曲)上下文/模式或「上下文的棧」的堆棧。萊克斯如何模擬模式或上下文

我特別想寫出具有字符串文字,可以送你回一個表達式-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; 
} 
+1

你看過[開始條件](http://westes.github.io/flex/manual/Start-Conditions.html)嗎?如果我理解你的問題,那就是你正在尋找的東西(儘管可能我完全不瞭解你的需求)。如果您使用flex,順便說一下,令牌不存在任意限制;緩衝區將被擴展,直到malloc拒絕提供更多空間。 – rici

回答

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的說明。