3

Ragel がすべての入力を消費することを要求するより良い方法はありますか? これが私が今使っているものです:

=begin
%%{
  machine my_lexer;
  # ...
  # extract tokens and store into `tokens`
  # ...
}%%
=end

class MyLexer

  %% write data;

  def self.run(string)
    data = string.unpack("c*")
    eof = data.length
    tokens = []
    %% write init;
    %% write exec;
    data.length == p ? tokens : nil
  end

end

data.length == pテストを除いて、上記のほとんどはボイラープレートです。これは機能しますが、レクサーが最終状態で終了したことを確認しないことを除きます。そのため、入力全体が正常に解析されなかった場合でもトークンを返すテスト ケースがあります。

より良い方法はありますか?

(最終状態を直接テストする方がうまくいくかもしれません。その方法を検討しています。アイデアはありますか?)

4

2 に答える 2

3

グローバルまたはローカルのエラー アクションを使用して、エラーを処理できます。

グローバル エラー アクションの場合、次の構文を使用できます。

$!action

マシン定義に対してローカルなローカル エラー アクションの場合、次の構文を使用できます。

$^action

アクションにフラグを立てると、フラグをチェックしてエラーを検出できます。

于 2013-06-06T10:10:08.647 に答える
1

私はラゲルから始めたばかりですが、入力が終了したとき、または次の文字が現在の状態からの遷移を満たさないときにそれぞれ実行される EOF アクションまたはエラー アクションを見たいと思う可能性があります。

于 2012-08-23T07:14:52.740 に答える