ARGENTO CUORE

 May the code be with you.

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010.06.12[土] 再帰下降法

再帰加工法で計算するクラスを作ってみた。
とりあえずできたっぽいかなー……。

↓を参考にしましたー。
http://www.hakkaku.net/articles/20090128-304

package com.gmail.cuore.argento.UO

/**
* RecursiveDescentParser
*/
object RDParser {
var data:Array[Byte] = null
var count = 0
var isContinue = true

//println("answer=" + expression())
private def getCurrentValue():Byte = {
if(count < data.length){
var ret = data(count)
count += 1
return ret
}
isContinue = false
return 0
}

private def expr3():Int = {
var num = getCurrentValue()
if(num == KEY.NUMBER){
val ret = Calc.getInt(Arrays.copyOfRange(data, count, count+4))
count+=4
return ret
}else if(num == KEY.LPAREN){
val answer = expr1()
val res = getCurrentValue()
if(isContinue){
if(res != KEY.RPAREN){
System.err.println("Right parenthesis not found.")
}
}
return answer
}

return num
}

private def expr2():Int = {
var num = expr3()
var res = getCurrentValue()
if(res == KEY.ASTERISK){
num *= expr3()
}else if(res == KEY.SLASH){
num /= expr3()
}else{
count -= 1
return num
}
return num
}

private def expr1():Int = {
var num = expr2()
val res = getCurrentValue()
if(res == KEY.PLUS){
num += expr2()
}else if(res == KEY.MINUS){
num -= expr2()
}else if(res == KEY.ASTERISK || res == KEY.SLASH){
count -= 1
return num
}else{
return num
}
return num
}

def expression(d:Array[Byte]):Int = {
data = d
isContinue = true
count = 0
return expr1()
}
}
スポンサーサイト

Comment

2010.06.16 Wed 21:43  NEW

もう一個違うエンジン見つけたので
書きこ見ました。

http://www.jpct.net/jpct-ae/
  • #-
  • VICKS 
  • [URL]
  • [Edit]






(編集・削除用)


管理者にだけ表示を許可

Trackback

http://ronor.blog81.fc2.com/tb.php/117-d32483d3

この記事にトラックバック(FC2Blog User)

Scala Feed

scala feed

FC2カウンター

プロフィール

RoNor

Author:RoNor
得意呪文はScalaですって言えるようになるのが夢です。
デスマーチ中、パーティメンバーの防御力を向上させたりさせなかったり。

検索フォーム

QRコード

QRコード

Copyright © 2009-2010 ARGENTO CUORE and RoNor All rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。