2010-04-30 6 views
17

estoy aprendiendo Analizador combinadores en Scala y ver diferentes maneras de ver parsing.I principalmente tres diferentes tipos de analizadores ie.RegexpParsers, StandardTokenParsers y JavaTokenParsers.I Soy nuevo en el análisis y no conseguir la idea de cómo elegiremos el analizador adecuado de acuerdo con nuestros requisitos. ¿Puede alguien explicar cómo funcionan estos analizadores diferentes y cuándo usarlos?Diferencia betwean RegexpParsers, StandardTokenParsers y JavaTokenParsers en Scala

Respuesta

6

RegexpParsers le permiten usar los valores de RE (normalmente en el formulario "re pattern".r pero igualmente cualquier otra instancia de Regex). No hay producciones léxicas predefinidas (tokens).

JavaTokenParsers define producciones léxicas para los tokens de Java: decimalNumber, floatingPointNumber, stringLiteral, wholeNumber, ident (identificador).

StandardTokenParsers define las producciones léxicas "... para un lenguaje simple parecido a Scala. Analiza palabras clave e identificadores, literales numéricos (enteros), cadenas y delimitadores". Sus componentes están realmente definidos en StdLexical.

22

Existen varios rasgos de analizador y clases de base diferentes para diferentes propósitos.

El rasgo principal es scala.util.parsing.combinator.Parsers. Esto tiene la mayoría de los combinadores principales como opt, rep, elem, accept, etc. Sin duda, consulte la documentación de este, ya que esto es más de lo que necesita saber. La clase real Parser se define como una clase interna aquí, y también es importante saberlo.

Otro rasgo importante es scala.util.parsing.combinator.lexical.Scanners. Este es el rasgo básico para los analizadores que leen una secuencia de caracteres y producen una secuencia de tokens (también conocidos como lexers). Para implementar este rasgo, necesita implementar un analizador whitespace, que lee los caracteres de espacios en blanco, comentarios, etc. También necesita implementar un método token, que lee el siguiente token. Los tokens pueden ser lo que quieras, pero deben ser una subclase de Scanners.Token. Lexical extiende Scanners y StdLexical extiende Lexical. El primero proporciona algunas operaciones básicas útiles (como digit, letter), mientras que el último realmente define y lee los tokens comunes (como literales numéricos, identificadores, cadenas, palabras reservadas). Solo tiene que definir y reserved, y obtendrá algo útil para la mayoría de los idiomas. Las definiciones de token están en scala.util.parsing.combinator.token.StdTokens.

Una vez que tenga un lexer, puede definir un analizador que lea una secuencia de tokens (producidos por el lexer) y genere un árbol de sintaxis abstracta. Separar el lexer y el analizador es una buena idea, ya que no tendrá que preocuparse por el espacio en blanco, los comentarios u otras complicaciones en su sintaxis. Si usa StdLexical, puede considerar usar scala.util.parsing.combinator.syntax.StdTokenPasers que tiene analizadores incorporados para convertir los tokens en valores (por ejemplo, StringLit en String). No estoy seguro de cuál es la diferencia con StandardTokenParsers. Si define sus propias clases de tokens, solo debe usar Parsers por simplicidad.

Preguntas específicamente sobre RegexParsers y JavaTokenParsers. RegexParsers es un rasgo que se extiende Parsers con un combinador adicional: regex, que hace exactamente lo que cabría esperar. Mezcle en RegexParsers con su lexer si desea usar expresiones regulares para hacer coincidir los tokens.JavaTokenParsers proporciona algunos analizadores que lex tokens de la sintaxis de Java (como identificadores, enteros) pero sin el token baggage de Lexical o StdLexical.

Para resumir, probablemente desee dos analizadores: uno que lea caracteres y produzca tokens, y uno que tome tokens y produzca un AST. Utilice algo basado en Lexical o StdLexical para el primero. Use algo basado en Parsers o StdTokenParsers para el segundo dependiendo de si usa StdLexical.