2012-10-11 18 views
0

這是一個從萊克斯,不知道的一些語法

假設法結構的定義是:

... definitions ... 
%% 
... rules ... 
%% 
... subroutines ... 

示例文件之一,我第一次看到下面的行自定義部分:

%x PP PRAGMA 

然後在規則中的一部分,我看到:

<PP>[ \t\r]*    { } 
<PRAGMA>.     { } 
^[ \t]*#[ \t]*version  { BEGIN PP; return VERSION_TOK; } 

所以,下面就是我的問題(我的理解法的一般概念):

  1. 什麼是PP PRAGMA?我應該如何理解%x?
  2. 規則部分:什麼和意思?他們不應該是一個令牌,對吧?
  3. BEGIN PP是什麼意思?

回答

2

<PP><PRAGMA>是「起始條件」。事實上,他們是「獨家」的開始條件,因爲他們是用%x宣佈的。 (%s將宣佈「包容性」開始條件。)

我不知道他們爲什麼稱爲啓動條件; 「開始」一詞有點混亂。你可以把它們看作詞彙狀態,但這也會有點混亂,因爲「狀態」通常意味着不同的東西。

在詞法分析過程中的任何時刻,lex都有一個活躍的「開始條件」。大多數情況下,(預定義的默認)啓動條件INITIAL處於活動狀態;在你沒有聲明任何啓動條件的情況下,情況總是如此。您可以用宏BEGIN(CONDITION)「輸入」開始條件。

僅當CONDITION是主動啓動條件時纔會使用規則<CONDITION>。規則可以在尖括號內包含多個條件名稱,或者它可以有<*>(表示所有條件),或者它可以根本沒有條件。只要活動條件爲「包含」,就會使用不指定條件的規則。如果激活條件是「獨佔」,則僅使用專門命名條件的規則(包括<*>通配符規則)。

條件實際上是整型常量,當前條件是YY_START的值。例如,您可以將它們保存起來並在稍後恢復它們,儘管lex提供了一種方便的條件堆棧以使其更容易。

我相信,開始進行正常的定義是:

#define BEGIN YY_START = 

這就是爲什麼你沒有把周圍的狀況名括號(如BEGIN PP),但我個人認爲這是不好的因爲至少有些lex-alikes實際上將BEGIN定義爲一個宏觀參數。

順便說一句,啓動條件非常方便。

+0

這樣一個美麗而明確的解釋!完全讚賞! – fiftyplus

相關問題