参考資料ですが、以下をお勧めします。
また、上のサイトの作者が書かれた書籍もお勧めします。(少し古いですが)
- 『Ruby を256倍使うための本 無道編』 青木峰郎著(ASCII)
「parse error on value "hello" (WORD) 」ですが、記号「WORD」,値「hello」のトークンが出現したところで構文解析エラーになりました、ということです。
考えられるのは、パーサ(の文法)が間違っているか、入力テキストが文法に違反しているか、のいずれかです。
例えば、以下のようなパーサがあったとします。
lang
1class MyParser
2rule
3
4 line : MARK WORD
5
6end
7
8---- inner
9def parse(f)
10 @q = []
11
12 f.read.split.each do |s|
13 case s
14 when "*" ; @q << [:MARK, s]
15 when "hello" ; @q << [:WORD, s]
16 else ; @q << [s, s]
17 end
18 end
19
20 do_parse
21end
22
23def next_token
24 @q.shift
25end
26
27---- footer
28MyParser.new.parse $<
この時、入力テキストが「* hello」であれば構文解析は成功しますが、「hello hello」である場合は同様のエラーメッセージを出して失敗します。(1番目の"hello"のところでエラーです)
パーサが仕様通りの動作で入力テキストが間違っているならば問題ありません。
ですが、本来「hello hello」も解析可能でなければいけないのであれば、文法を修正します。
この場合であれば rule 〜 end を、例えば以下のように修正します。
lang
1rule
2
3 line : MARK WORD
4 | WORD WORD
5
6end
「def,end,putsなどの〜文字列と変数名などの〜文字列をうまく分けることができません。」ですが、ここはパーサというよりレキサが頑張るところだと思います。
Ruby には StringScanner クラスがライブラリにあるので、ご使用を検討されてはいかがでしょう。
また、Ruby プログラム自体を解析する場合は Ripper クラスを使用することもできます。
標準ライブラリ以外では、Ruby版lex のような Rex というツールもあります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。