2012-05-30 13 views
6

Tengo un analizador de Scala en funcionamiento, pero la solución no es tan limpia como me gustaría. El problema es que algunas de las producciones deben considerar el espacio en blanco como parte del token, pero las producciones de "alto nivel" deberían poder ignorar/omitir el espacio en blanco.Scala Analizador que a veces se salta el espacio en blanco y otras veces no

Si utilizo el típico patrón de scala para ampliar los analizadores de nivel inferior, los ajustes de skipWhitespace se heredan y las cosas se complican muy rápidamente.

Creo que sería mejor no usar el enfoque de extensiones, sino tener una instancia del analizador de bajo nivel disponible en la clase de analizadores de nivel superior, pero no estoy seguro de cómo hacer que funcione, de modo que cada instancia vería solo una secuencia de caracteres de entrada.

Aquí es parte del analizador de nivel más bajo -

class VulgarFractionParser extends RegexParsers { 
    override type Elem = Char 

override val whiteSpace = "".r 

Entonces se extienden al igual que

class NumberParser extends VulgarFractionParser with Positional { 

Pero en este punto el NumberParser debe manejar de manera explícita los espacios en blanco al igual que el FractionParser. Para NumberParser sigue siendo bastante manejable, pero en el siguiente nivel, realmente quiero poder definir producciones que do use espacios en blanco como un separador como lo haría un regexParser normal.

Un ejemplo sería algo como:

IBM 33.33/ 1200.00 
or 
IBM 33.33/33.50 1200.00 

El segundo valor a veces tiene dos partes separadas por un "/" y, a veces sólo tiene una sola pieza con nada después de la barra (o incluso que no contiene una barra en absoluto).

def bidOrAskPrice = ("$"?) ~> (bidOrAskPrice1 | bidOrAskPrice2 | bidOrAskPrice3) 

    def bidOrAskPrice1 = number ~ ("/".r) ~ number ~ (SPACES) ^^ { 
    case a ~ slash ~ b ~ sp1 => BidOrAsk(a,Some(b)) 
    } 
    def bidOrAskPrice2 = (number ~ "/" ~ (SPACES)) ^^ { case a ~ slash ~ sp => BidOrAsk(a,None) } 
    def bidOrAskPrice3 = (number ~ (SPACES?)) ^^ { case a ~ sp => BidOrAsk(a , None)} 
+0

¿Puedes dar algunos ejemplos de producciones que deberían considerar el espacio en blanco y algunos ejemplos de producciones que no deberían considerar el espacio en blanco? – sarnold

+0

actualizó la pregunta con un ejemplo de los datos y uno de los elementos sensibles al espacio en blanco. – malsmith

Respuesta

2

¿No tiene más sentido para convertir el primer programa de análisis en un analizador de fichas (un analizador léxico, en realidad), y hacer la segunda lectura del analizador que en vez de simple Char?

+1

No he visto un ejemplo de este enfoque, pero suena más como lo que quiero. – malsmith

Cuestiones relacionadas