0

コンパイラのクラスの構文テキスト修正を実行しようとしています。アイデアは次のとおりです。「ルビーは素晴らしい」のように、「有効なフレーズはSUBJECT VERB ADJECTIVE」のように、言語(私の場合はポルトガル語)に固有のルールがいくつかあります。

さて、最初に「ルビーは素晴らしい」という入力をトークン化する必要があります。だから私はたくさんの動詞を1行ずつ含むテキストファイル「動詞」を持っています。次に、「形容詞」、「代名詞」などのテキストが1つあります。

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を使用したいのですが、それも実際には必要ありません。

ありがとう。

4

2 に答える 2

2

コンパイル時にファイルを読みたい場合は、次の形式にします。

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

次に、ragel の 'include' または 'import' ステートメント (どれを.. マニュアルを確認する必要があるか忘れました) を使用してインポートします。


実行時にサブジェクトのリストを確認したい場合は、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;
}%%
于 2011-11-30T13:35:53.667 に答える
0

バイソンでは、定義済みの辞書で単語を検索するレクサーを手動で記述します。

于 2010-07-06T14:56:56.823 に答える