2011-05-29 94 views
0

我正在試圖製作一個簡單的繪圖程序,讀取translate (rect 10 10 10 10) 50 50。我正在嘗試將其拆分,以便50 50translate一起使用,而rect保留所有10幫助解析S-表達式

這是一個PostScript填充。我聽說過散列表和堆棧,但我不知道如何使用它們。我做了所有其他事情(e.x.所有形狀的計算)。我只是不明白如何解析這些行,以便我可以將數字指向正確的變量。

+3

你能告訴我們你到目前爲止,以便我們可以幫助嗎? – Johnsyweb 2011-05-29 02:01:40

+1

您需要關於Stack Overflow提問的問題,我想! – 2011-05-29 02:07:58

+0

只是因爲你說*「這是一個PostScript填充」*我發現自己想知道爲什麼你不會以字爲單位反轉字符串,並將它解析爲基於堆棧的後綴命令語言,比如......好吧......後記。或者你可以從字符串的後面讀取令牌。當然,如果你這樣做,你不需要括號。 – dmckee 2011-05-29 04:15:05

回答

1

您的示例看起來像是一個Lisp s表達式,因此請嘗試搜索「s表達式解析器」。一些點擊出現。

如果你想去「整個豬」,你可以實現你的形狀例程爲C++類,使用SWIG將它們暴露給GNU Guile,並在Scheme中編寫你的應用程序。雖然這可能不是你想到的。 :-)

+0

以及im限於C++和我無法使用預先製作的庫..我的想法是哈希表,堆棧和數組...我只是不知道如何使用這些來讀取行 – 2011-05-29 02:10:28

+2

@Jr添:「無法使用預製庫「...請做解釋。 StackOverflow允許提問有關家庭作業的問題(只要教師允許),但你應該清楚地說它是作業。如果不是,那麼更好地描述你可以使用和不能使用的庫(以及爲什麼)會有所幫助。 – 2011-05-29 02:28:39

+0

是的這是一個hw問題 – 2011-05-29 02:39:55

0

好吧,這可能有點過時,但很簡單,沒有什麼更快。

void scanWhite(char*& p){ 
    while(*p==' ') p++; 
} 

bool seeInt(char*& p, int& num){ 
    scanWhite(p); 
    char* p1 = p; 
    bool bNegative = false; 
    if (*p=='-'){bNegative = true; p++;) 
    if (!isdigit(*p){p = p1; return false;} 
    num = 0; 
    while(isdigit(*p)){ 
    num *= 10; 
    num += (*p - '0'); 
    p++; 
    } 
    if (bNegative) num = - num; 
    return true; 
} 

bool seeWord(char*& p, char* word){ 
    scanWhite(p); 
    int len = strlen(word); 
    if (strncmp(p, word, len)==0 && !isalphanumeric(p[len])){ 
    p += len; 
    return true; 
    } 
    else return false; 
} 

bool seeChar(char*& p, char c){ 
    scanWhite(p); 
    if (*p != c) return false; 
    p++; 
    return true; 
} 

bool parseTranslateRect(char*& p 
    , int& x0, int& y0, int& x1, int& y1 
    , int& dx, int& dy 
) 
{ 
    if (!seeChar(p, '(')) return false; 
    if (!seeWord(p, "translate")) return false; 
    if (!seeChar(p, '(')) return false; 
    if (!seeWord(p, "rect")) return false; 
    if (!seeInt(p, &x0)) return false; 
    if (!seeInt(p, &y0)) return false; 
    if (!seeInt(p, &x1)) return false; 
    if (!seeInt(p, &y1)) return false; 
    if (!seeChar(p, ')')) return false; 
    if (!seeInt(p, &dx)) return false; 
    if (!seeInt(p, &dy)) return false; 
    if (!seeChar(p, ')')) return false; 
    return true; 
} 

如果你已經有了一個「(翻譯(矩形...」,只需調用解析程序一遍又一遍,直到它返回false。許多副本

0

這裏是你如何寫C++解析器使用AXE library

Rect r; 
auto rect = "(rect " 
    & r_decimal(r.left) & space 
    & r_decimal(r.top) & space 
    & r_decimal(r.right) & space 
    & r_decimal(r.bottom) & space 
    & ')'; 

Point t; 
auto translate = "translate " & rect 
    & space & r_decimal(t.x) 
    & space & r_decimal(t.y); 
// test it 
std::string str("translate (rect 10 10 10 10) 50 50"); 
auto match = translate(str.begin(), str.end()); 

,它將分析中的PS文件一個翻譯的語句如果你需要分析所有的翻譯語句並不在乎寫的後記格式的完全成熟的解析器,你可以使用*r_find(translate)規則跳過你的輸入不關心。 r_find(R)規則搜索輸入,直到找到規則R。現在這很容易,它也會生成非常快速的代碼,可能比手寫「if」-s和「else」-s更快。

免責聲明:我不測試上面的代碼,所以可能有小錯誤。