Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(JavaCC コメント文の読み飛ばしについて。)
閲覧数:366
掲示板(JavaCC コメント文の読み飛ばしについて。)
名前
匿名
題名 JavaCC コメント文の読み飛ばしについて。
質問内容

質問を評価する
(0ポイント)
Eclipse4.3とJavaCCを使って自分の考えている日本語で書けるようなプログラミング言語のコンパイラーを作ろうとしています。
今コメント文を読み飛ばすためのところを作っています。
私の考えている言語ではコメント文は以下の2パターンがあります。

・コメント文が1行のときの例
コメント ここはコメント

・コメント文が複数行のときの例
コメントここから ここはコメント
ここもコメント
ここもコメント コメントここまで

"コメント"や"コメントここから"の後、"コメントここまで"の前は全角あるいは半角のスペースを空けて書くことをルールにしようかとも思いましたが、"コメントここから"や"コメントここまで"をコメント本文と行を分けて書きたいこともあるだろうからとスペースなしでも読み飛ばすようにしようと思い、以下のように書いてみました。

SKIP:
{
  "コメント"(~["\r","\r\n","\n"])* (["\r","\r\n","\n"])?
}

MORE:
{
  "コメントここから" :IN_COMMENTS
}

< IN_COMMENTS >MORE:
{
  (~[])
}

< IN_COMMENTS >SKIP:
{
  "コメントここまで" :DEFAULT
}

ですが、"コメント"の行で以下のようなエラーが出てしまいます。

Exception in thread "main" org.javacc.parser.TokenMgrError: Lexical error at line 51, column 16.  Encountered: "\\" (92), after : ""

試しに"コメント"のSKIPを消すと、"コメントここから"の行で以下のようなエラーが出てしまいます。

Exception in thread "main" org.javacc.parser.TokenMgrError: Lexical error at line 52, column 31.  Encountered: "\r" (13), after : "\"\u7e67\uff73\u7e5d\uff61\u7e5d\uff73\u7e5d\u533b\uff05\u7e3a\u8599\u00b0\u7e67\ufffd :IN_COMMENTS"

さらに"コメントここから"のMOREも消してみると、(~[])のところで以下のようなエラーが出てしまいます。

org.javacc.parser.ParseException: Encountered " "(" "( "" at line 51, column 3.

さらに、(~[])のMOREも消してみると、エラーはどこにも表れません。

そもそもEclipseでの色付けがそれらの箇所において正しくできていないことからもエラーが出てしまうことは予測がつくのですが、エラーメッセージや色付けが意味する情報を見てみても私には何が原因なのかが分かりません。

一度判定材料に日本語(というかUnicode)を用いていることが原因なのかと思もい、試しに半角英字のみにしてみましたが、それでも同じようなエラーが出てしみました。
そもそも"コメントここまで"の行でとくに何も言われないことからも、Unicodeが原因ではないと思っています。

一体何が原因なのでしょうか?
質問日時 2013-12-03 10:36:46
名前
匿名
回答内容

回答を評価する
(0ポイント)
SKIPは読み飛ばす文字の集合の定義で、コメントは
SPECIAL_TOKENを使って定義するらしい。
回答日時 2013-12-03 21:29:36
名前
匿名
回答内容

回答を評価する
(0ポイント)
私が参考にしている青木峰郎著「ふつうのコンパイラをつくろう」では、1行のコメント文はSPECIAL_TOKEN命令を使い、複数行のコメントではMORE命令とSKIP命令を使っていました。
その本で作っていたコメント文はJavaやC言語などで使うようなものでしたが。
そこでは、SPECIAL_TOKENを使っている理由として
「本書のコンパイラではスキャンした文字列をすべて表示する機能をつけるために、SKIP命令でなくSPECIAL_TOKEN命令を使っています。」
とあります。
私はそういう機能はなくてもいい気がするので、SPECIAL_TOKEN命令ではなくSKIP命令でいいと思いました。

読み飛ばす予定のコメント文にアクセスするつもりがないとしても、コメント文の読み飛ばしについてはSPECIAL_TOKEN命令を使った方がいいのでしょうか?
回答日時 2013-12-03 23:34:32
名前
匿名
回答内容

回答を評価する
(0ポイント)
なんか、

http://www.cmt.phys.kyushu-
u.ac.jp/~M.Sakurai/java/javacc.html

日本語だめって書いてあるとこもあるね。
回答日時 2013-12-03 23:50:20
名前
匿名
回答内容

回答を評価する
(0ポイント)
やっぱりというかなんというか全角は相性が悪いことがありますね・・・
教えてくださったサイトなどを参考にこのままがんばるか、無理そうなら別のパーサジェネレータを探してみます。
回答日時 2013-12-04 00:10:00
名前
匿名
回答内容

回答を評価する
(0ポイント)
教えてくださったサイトに使えそうなリンクがあったのですが、そのリンクがどこを探しても見つからない(Google検索でも見つからないのでなくなってる?)のであまり役に立ちませんでした。
それ以外にも日本語トークンについていろいろ調べてみましたが、使えそうな情報がまだ見つかっていません。
回答日時 2013-12-04 12:37:50
回答内容を入力し、「確認」ボタンをクリックしてください。
ログインしていません。ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 ユーザIDをお持ちでない方は「ID登録」からユーザIDの登録を行ってください。
氏名 匿名
回答内容
 



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道