2012-03-24 3 views
4

Я пытаюсь написать парсер в Scala для SML с токенами. Он работает почти так, как я хочу, чтобы он работал, за исключением того факта, что в данный момент он обрабатываетScala разбор взаимно-рекурсивных функций для SML

Позволяет получать удовольствие f x = r и fun g y in r end;

вместо

пусть прикольных ф х = г и г у в г конце;

Как мне изменить код, чтобы он распознал, что для второй функции не нужен 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

Вы можете вставить FunToken обратно в свой входной поток с помощью функции «uneat». Это не самое элегантное решение, но оно требует наименьшей модификации вашего текущего кода.

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] 

Btw, я думаю, что есть и другие проблемы, связанные с вашим разборе удовольствия. AFAICS, вы не разбираете никаких «=» в забавном случае. Более того, после «и» вы даже не разбираете какие-либо идентификаторы, а только тело функции.

Смежные вопросы