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
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
.
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
.
- 1. ¿Diferencia entre Iterator y Stream en Scala?
- 2. ¿La diferencia entre 'HashSet' y 'Set' en Scala?
- 3. En Scala, ¿cuál es la diferencia entre Any y Object?
- 4. ¿Cuál es la diferencia entre :: ::: y en Scala
- 5. ¿Cuál es la diferencia entre toString y mkString en scala?
- 6. Diferencia entre tipos curry similares en Scala
- 7. diferencia entre el método y la función de Scala
- 8. ¿Cuál es la diferencia entre scala @Serializable y Java Serializable?
- 9. && y || en Scala
- 10. x = y = 1 en Scala?
- 11. Diferencia entre MutableList y ListBuffer
- 12. netbeans 7.0 y scala resulta en stackoverflow
- 13. Akka y construido en Scala Actores: ¿Cuál es la diferencia para el uso local?
- 14. En Scala Akka futuros, ¿cuál es la diferencia entre map y flatMap?
- 15. En Scala, ¿cuál es la diferencia entre usar `_` y usar un identificador con nombre?
- 16. ¿Cuál es la diferencia entre `null == last` y` null eq last`, en Scala?
- 17. Scala AST en Scala
- 18. App-motor y Scala
- 19. Scala, Morphia y Enumeration
- 20. Scala, Android y Eclipse
- 21. Scala Parser Issues
- 22. Xcode y Scala
- 23. Analizando Scala y HTML
- 24. Hibernate y Scala
- 25. clojure y scala interop
- 26. Diferencia entre la clase abstracta y Rasgo
- 27. Combinadores Scala Parser: Parse eficientemente Comentarios C-Style
- 28. diferencia rasgo dinámico de Scala 2.9 a 2.10
- 29. Diferencia entre. y: en Lua
- 30. Diferencia entre == y === en JS