我正在學習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. Anorm Scala executeUpdate和executeInsert之間的區別
- 4. Scala中的>>和>>>之間的區別
- 5. 之間的〜/和的區別../
- 6. Scala中的JsObject和JsValue之間有什麼區別?
- 7. Scala中f(a,b)和f(a)(b)之間的區別
- 8. Scala中迭代器和流之間的區別?
- 9. 在Scala中,樂趣_和樂趣之間的區別是什麼
- 10. Scala中&和&&的區別?
- 11. '#','%'和'$'之間的區別
- 12. {!!之間的區別!!}和{{}}
- 13. '+ ='和'= +'之間的區別?
- 14. 「。+」和「。+?」之間的區別
- 15. .eq之間的區別。和==
- 16. #。/和#之間的區別。 ./
- 17. !=和!之間的區別==
- 18. 「%〜dp0」和「。\」之間的區別?
- 19. | =和^ = css之間的區別
- 20. 之間的區別。和#
- 21. ==和case之間的區別?
- 22. 「**/* /」和「** /」之間的區別?
- 23. jQuery - '。'之間的區別和「#」
- 24. 「?1」和「?」之間的區別
- 25. `%in%`和`==`之間的區別
- 26. fmod和%之間的區別
- 27. 之間的區別:+和:+
- 28. []和()之間的區別創建新的Scala對象
- 29. make中的「$(shell ...)」和「$$(...)」之間的區別
- 30. python中的[]和[,,]之間的區別