def func(x) の場合、'(' を先読みした時点で func が reduce されるので、そこで yylex に指示すれば、次の token 'x' はローカル変数になるが、 def proc x の場合、proc が reduce されるのは token 'x' を先読みし終えた時点。 なので、そこで「次からlocalな」と yylex に指示しても x は手遅れでグローバル変数として登録済み。 def 命令定義の場合に限ったら、def と proc の間で yylex に指示すればまあいいのだけれど、いちいち先読みを気にして構文解析するとかムリなので、解決方法としては構文解析側で識別子を解決するするしかないという結論。 これまで何回かオレオレ言語を作りましたが、名前空間を分けたことがありませんでした。 経験不足を痛感しますね。 GC も実装したこと無いのでお先真っ暗闇です。