我正在学习scala中的Parser Combinators,并且看到了不同的解析方式。我主要看到三种不同的解析器ie.RegexpParsers,StandardTokenParsers和JavaTokenParsers.I是新解析并且不能获取我们将如何根据我们的要求选择合适的解析器。可以请任何人解释这些不同的解析器如何工作以及何时使用它们。Scala中的RegexpParsers,StandardTokenParsers和JavaTokenParsers之间的区别
回答
RegexpParsers
允许您使用RE值(通常以"re pattern".r
的形式,但同样也是其他任何Regex实例)。没有预先定义的词汇生成(令牌)。
JavaTokenParsers
定义为Java令牌词法制作:decimalNumber
,floatingPointNumber
,stringLiteral
,wholeNumber
,ident
(标识符)。
StandardTokenParsers
定义词汇产生“...为一个简单的类似Scala的语言,它解析关键字和标识符,数字文字(整数),字符串和分隔符。其成分实际上在StdLexical
中定义。
为了不同的目的,有几种不同的解析器特征和基类。
主要特征是scala.util.parsing.combinator.Parsers
。这有大多数主要组合器,如opt
,rep
,elem
,accept
等。绝对查看这个文档,因为这是你需要知道的大部分内容。实际的Parser
类在这里被定义为内部类,这也是很重要的。其他重要特征是scala.util.parsing.combinator.lexical.Scanners
。这是解析器的基本特征,它读取字符流并产生一个令牌流(也称为词法分析器)。为了实现这个特性,你需要实现一个whitespace
解析器,该解析器读取空白字符,注释等。你还需要实现一个token
方法,该方法读取下一个标记。令牌可以是任何你想要的,但它们必须是Scanners.Token
的子类。 Lexical
延伸Scanners
和StdLexical
延伸Lexical
。前者提供了一些有用的基本操作(如digit
,letter
),而后者实际上定义和解释了常用的标记(如数字文字,标识符,字符串,保留字)。你只需要定义和reserved
,你会得到一些对大多数语言有用的东西。令牌定义在scala.util.parsing.combinator.token.StdTokens
。
一旦你有了一个词法分析器,你可以定义一个解析器,它读取一个标记流(由词法分析器产生)并生成一个抽象语法树。分离词法分析器和分析器是一个好主意,因为您不需要担心语法中的空白或注释或其他复杂因素。如果您使用StdLexical
,则可以考虑使用内置解析器的scala.util.parsing.combinator.syntax.StdTokenPasers
将令牌转换为值(例如,StringLit
转换为String
)。我不确定与StandardTokenParsers
有什么不同。如果您定义自己的令牌类,则应简单使用Parsers
。
您特别询问了有关RegexParsers
和JavaTokenParsers
。 RegexParsers
是一个扩展Parsers
与一个额外的组合:regex
,这完全符合你的期望。如果您想使用正则表达式来匹配令牌,请将RegexParsers
混合到您的词法分析器中。JavaTokenParsers
提供了一些解析器,它们从Java语法(如标识符,整数)中抽出令牌,但没有Lexical
或StdLexical
的令牌行李。总之,您可能需要两个解析器:一个读取字符并生成标记,另一个读取标记并生成AST。首先使用基于Lexical
或StdLexical
的东西。取决于您是否使用StdLexical
,根据Parsers
或StdTokenParsers
第二次使用。
- 1. Scala StandardTokenParsers vs JavaTokenParsers
- 2. scala和java枚举之间的区别
- 3. 在Scala中,乐趣_和乐趣之间的区别是什么
- 4. Scala中迭代器和流之间的区别?
- 5. Scala中f(a,b)和f(a)(b)之间的区别
- 6. Scala中的JsObject和JsValue之间有什么区别?
- 7. '+ ='和'= +'之间的区别?
- 8. {!!之间的区别!!}和{{}}
- 9. ==和case之间的区别?
- 10. '#','%'和'$'之间的区别
- 11. | =和^ = css之间的区别
- 12. “%〜dp0”和“。\”之间的区别?
- 13. .eq之间的区别。和==
- 14. ==和.equals()之间的区别?
- 15. `%in%`和`==`之间的区别
- 16. []和()之间的区别创建新的Scala对象
- 17. javascript中的/ * * /和//之间的区别
- 18. python中的[]和[,,]之间的区别
- 19. make中的“$(shell ...)”和“$$(...)”之间的区别
- 20. C中的/ +和+之间的区别?
- 21. Scala如何知道“def foo”和“def foo()”之间的区别?
- 22. SPFile和PublishingPage类别之间的区别
- 23. System.Timers.Timer Enabled = true和.Start()之间的区别Enabled = true和.Start()之间的区别
- 24. Selenium中verifyText和verifyTextPresent之间的区别
- 25. angularjs中$ cookiestore和$ cookies之间的区别
- 26. ios中stringByAppendingString和appendString之间的区别
- 27. XPath中// * /和/ * //之间的区别?
- 28. TestNG中@DataProvider和@Parameters之间的区别
- 29. Azure中CloudDrive.Delete()和CloudBlobContainer.Delete()之间的区别
- 30. OpenSSL中EVP_PKEY_RSA和EVP_PKEY_RSA2之间的区别?