2012-03-24 9 views
4

トークンでSML用のScalaにパーサを書き込もうとしています。これは現在、私はそれが現在解析しているという事実を除いて、動作するようにほとんど動作します。SMLの相互再帰関数を解析するスカラ

r =

の代わりに

r endでfun fx = rとg yを楽しんでください。

2番目の機能にFunTokenは必要ないと認識するようにコードを変更するにはどうすればよいですか?

def parseDef:Def = { 
    currentToken match { 
    case ValToken => { 
    eat(ValToken); 

    val nme:String = currentToken match { 
     case IdToken(x) => {advance; x} 
     case _ => error("Expected a name after VAL.") 
    } 

    eat(EqualToken);  
    VAL(nme,parseExp) 
    } 

    case FunToken => { 

    eat(FunToken); 

    val fnme:String = currentToken match { 
     case IdToken(x) => {advance; x} 
     case _ => error("Expected a name after VAL.") 
    } 

    val xnme:String = currentToken match { 
     case IdToken(x) => {advance; x} 
     case _ => error("Expected a name after VAL.") 
    } 

    def parseAnd:Def = currentToken match { 
     case AndToken => {eat(AndToken); FUN(fnme,xnme,parseExp,parseAnd)} 
     case _ => NOFUN 
    } 


    FUN(fnme,xnme,parseExp,parseAnd) 
    } 
    case _ => error("Expected VAL or FUN."); 
    } 
} 

答えて

0

"uneat"機能を使用してFunTokenを入力ストリームに戻すことができます。これは最も洗練されたソリューションではありませんが、現在のコードを最小限に修正する必要があります。

def parseAnd:Def = currentToken match { 
    case AndToken => { eat(AndToken); 
         uneat(FunToken); 
         FUN(fnme,xnme,parseExp,parseAnd) } 
    case _ => NOFUN 
} 
1

正しい文法を実装するだけです。代わりの

def ::= "val" id "=" exp | fun 
fun ::= "fun" id id "=" exp ["and" fun] 

SMLの文法は実際に私は楽しみのあなたの解析と他の問題があると思い、ところで

def ::= "val" id "=" exp | "fun" fun 
fun ::= id id "=" exp ["and" fun] 

です。 AFAICS、楽しいケースでは "="は解析されません。さらに、 "and"の後には、関数本体だけの識別子も解析されません。