2013-05-06 26 views

回答

3

Ragel希望有一些變量處於範圍之內,並指向正在掃描的緩衝區的各個重要部分。你可以找出它期望它們被調用的方式,以及如何在Ragel User Guide中更改它們。第5節,主機程序界面,在這裏是你的朋友。

從運行在所述第一參數中的掃描器手動一個例子:

#include <stdio.h> 
#include <string.h> 

%%{ 
    machine foo; 
    write data; 
}%% 

int main(int argc, char **argv) 
{ 
    int cs; 
    if (argc > 1) { 
     char *p = argv[1]; 
     char *pe = p + strlen(p); 
     %%{ 
      main := [0-9]+ ('.' [0-9]+)?; 
      write init; 
      write exec; 
     }%% 
    } 
    printf("result = %i\n", cs >= foo_first_final); 
    return 0; 
} 

基本上cs分別持有的機器的緩衝器的狀態和ppe點到開始和結束。

從手動的定義:

•CS - 當前狀態。這必須是一個整數,並且當數據分解爲獨立處理的塊時,它應該持續存在於機器的調用中。這個變量 可以從執行循環外部修改,但不能從內部修改。

•p - 數據指針。在C/D代碼中,這個變量應該是一個指向要處理的字符數據 的指針。它應該在機器的每次運行中初始化爲數據塊的開始。在Go中,Java和Ruby用作數據的oset,並且必須是整數。在 這種情況下,它應該在機器的每次運行中初始化爲零。

•pe - 數據結束指針。這應該被初始化爲p加上機器每次運行的數據長度。在Go中,Java和Ruby代碼應該初始化爲數據長度。

•eof - 文件結束指針。當正在處理的buer塊是最後一個 時,應將其設置爲pe,否則應將其設置爲null。在Go中,Java和Ruby代碼-1必須使用 而不是null。如果EOF事件只有在處理完最終塊塊 之後才能知道,那麼可以設置p = pe = eof並運行執行塊。

•data - 此變量僅在Go,Java和Ruby代碼中需要。它必須是包含要處理的數據的數組 。

•stack - 這必須是一個整數數組。它用於存儲代表 狀態的整數值。如果堆棧必須動態調整大小,Pre-push和Post-Pop語句可以使用 (5.6和5.7節)。

•top - 這必須是一個整數值,並將用作堆棧的oset,從而在堆棧頂部提供下一個 可用點。

•act - 這必須是一個整數值。它是一個有時用於掃描程序代碼的變量,用於保持 跟蹤最近成功的模式匹配。

•ts - 這必須是一個指向字符數據的指針。在Go中,Java和Ruby代碼必須是 整數。有關更多信息,請參見第6.3節。

+0

Thankx for you good help – whisper 2013-05-09 01:35:29

相關問題