history

青木日記 RSS

<前の日 | この月 | 次の日>

2006-07-05

Racc: その場でパーサ生成

ここ三日くらいの寝不足により、こんなのが動くようになった。

require 'racc'
 
grammar = Racc::Grammar.define {
  g = self
 
  g.precedence_table {
    prechigh
    left '*', '/'
    left '+', '-'
    preclow
  }
 
  g.target      = rule(:exp) | rule() { 0 }
 
  g.exp         = rule(:exp, '+', :exp) {|x,_,y| x + y }\
                | rule(:exp, '-', :exp) {|x,_,y| x - y }\
                | rule(:exp, '*', :exp) {|x,_,y| x * y }\
                | rule(:exp, '/', :exp) {|x,_,y| x / y }\
                | rule('(', :exp, ')') {|_,n,_| n }\
                | rule('-', :NUMBER) {|_,n| -n }\
                | rule(:NUMBER)
}
Calculator = grammar.parser_class

この仕組み自体より、腐ったコードを書き直すほうに時間を取られてしまった。

(01:21)

Racc: その場でパーサ生成 (2)

どうせなら「n 回以上の繰り返し」とか「省略可能」とかも実装したいところだが、 インターフェイスをどーしたもんかなー。 現状の rule(:exp, '+', :exp) {....} てのもベストとは言い難いし。

(01:27)

てんさく

さて逃避活動はイーカゲンにして、るびまの添削記事を書かねばいかんわけです。

(03:20)

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS