K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2126] Re:【質問】lexのトークン判断優先方法(プログラミング言語を作る3章質問その1)
返信


投稿者:(ぱ)こと管理人
2018/04/28 00:08:37

Link:
>疑問に思ったのは「123.456」を「123」を整数型トークン、「.」を例外トークン、
>「456」の整数型トークンと判断する方法や、「1」,「2」「3」「.」「4」「5」「6」を
>全て例外トークンとして扱うこともできそうな気がするのですが、そうならない
>理由がわからないためです。

これは、lexがなぜ「123.456」を実数トークンとして解釈するのかがわからない、
ということでしょうか?
lexは、「最長一致」でトークンを切り出します。つまり「123」や「1」よりも
「123.456」のほうが長いので、「123.456」は実数トークンとして解釈されます。
それについては本の中ではp.39の一番下の段落で説明しています。

>また、整数トークンと実数トークン、"if"トークンと[ \t]トークンの関係から
>推測すると、例えば"for while other if"みたいな命令語もトークンとして
>定義できそうですが、その場合に.lファイルでの定義行(ルール順番)によっては
>動きが変わるものなのでしょうか?

同じところに書いてある通り、lexはまず「最長一致」でトークンを切り出そうとし、
長さが同じなら、より前の規則、つまり.lファイルでの定義行が上のほうである
規則を優先します。

>整数型の場合「....|"0"」と0をダブルクォーテーションで括っていますが、
>電卓のケースでP.36では、「(....|0|([0-9]....)」と0をダブルクォーテーションで
>括っていません。この違いが上の判断条件に影響しているのでしょうか?

これはどちらでも同じですね。なぜ片方だけダブルクォートで囲んだのかは、
すみませんがさすがに思い出せません……
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より新しい投稿] [ より古い投稿]