2010-06-25 12 views
0

我試圖做我的編譯器的類sintax文本修正。我們的想法是:我有一些規則,這是固有的語言(在我的情況下,葡萄牙),像「一個有效的短語是受動詞形容詞」,如「Ruby是巨大的」。如何創建一個解析器來標記從文件中獲取的單詞列表?

好了,首先我來標記輸入「Ruby是巨大的」。所以我有一個文本文件「動詞」,有很多動詞,一行一行。然後,我有一個文本「形容詞」,一個「代名詞」等等

我試圖用Ragel創建一個解析器,但我不知道我怎麼會做這樣的事情:

%%{ 
    machine test; 
    subject = <open-the-subjects-file-and-accept-each-one-of-them>; 
    verb = <open-the-verbs-file-and-accept-each-one-of-them>; 
    adjective = <open-the-adjective-file-and-accept-each-one-of-them>; 
    main = subject verb adjective @ { print "Valid phrase!" } ; 
}%% 

我看了ANTLR,Lex/Yacc,Ragel等,但找不到能解決這個問題的人。我能想到的唯一方法就是預處理Ragel的輸入文件,以便我的程序讀取文件並將其內容寫入正確的位置。但我也不喜歡這個解決方案。

有誰知道我怎麼能做到這一點?沒有問題,如果它不是與Ragel,我只是想解決這個問題。我想使用Ruby或Python,但這也不是必需的。

謝謝。

回答

0

用野牛我會手工編寫詞法分析器,查找預定義字典中的單詞。

2

如果你想讀在編譯時文件..使它們是以下格式:

subject = \ 
ruby|\ 
python|\ 
c++ 

然後使用ragel的「包括」或「進口」語句(我忘了..必須檢查手冊)來導入它。


如果你想檢查的在運行時主題列表,也許只是讓ragel讀3個字,然後與每個單詞相關的動作。該動作可以讀取文件並在運行時查看單詞是否正確。

該動作讀取文本文件並比較單詞的內容。

%%{ 
machine test 

action startWord { 
    lastWordStart = p; 
} 
action checkSubject { 
    word = input[lastWordStart:p+1] 
    for possible in open('subjects.txt'): 
     if possible == word: 
      fgoto verb 
    # If we get here do whatever ragel does to go to an error or just raise a python exception 
    raise Exception("Invalid subject '%s'" % word) 
} 
action checkVerb { .. exercise for reader .. ;) } 
action checkAdjective { .. put adjective checking code here .. } 

subject = ws*.(alnum*)>startWord%checkSubject 
verb := : ws*.(alnum*)>startWord%checkVerb 
adjective := ws*.)alnum*)>startWord%checkAdjective 
main := subject; 
}%% 
相關問題