簡體   English   中英

解析器和詞法分析器的設計指南?

[英]Design guidelines for parser and lexer?

我正在寫一個詞法分析器(帶有re2c)和一個解析器(帶有Lemon),用於稍微復雜的數據格式:類似CSV,但在特定位置使用特定的字符串類型(僅限字母數字字符,字母數字字符和減號,除了引號和逗號但帶有平衡括號等),括號和字符串中的字符串看起來像函數調用,可以包含可以包含參數的開括號和右括號。

我的第一個鏡頭是一個有很多州的詞法分析器,每個州都適應特定的字符串格式。 但是,在詞法分析器的許多無意義的“意外輸入”消息(它變得非常大)之后,我意識到它可能正在嘗試完成解析器的工作。 我取消了我的第一次嘗試並且使用只有一個狀態的詞法分析器,許多字符標記和一個將標記組合成不同字符串類型的解析器。 這樣做效果更好,當某些內容關閉時,我會從解析器中獲得更多有用的語法錯誤,但它仍然感覺不太正確。 我正在考慮向詞法分析器添加一個或兩個狀態,但是從解析器啟動狀態,它具有更好的“概述”,在給定的實例中需要哪種字符串類型。 總的來說我覺得有點傻:(

我沒有正式的CS背景,並且有點偏離數學重的理論。 但也許有一個教程或書籍可以解釋詞法分析者應該(而且不應該)做什么以及解析器應該做哪些工作。 如何構造良好的令牌模式,何時使用詞法分析器狀態,何時以及如何使用遞歸規則(使用LALR解析器),如何避免使用惡意規則。 一本實用的食譜,教授基礎知識。 “Lex和YACC入門/ HOWTO”很不錯,但還不夠。 由於我只想解析一種數據格式,因此關於編譯器構建的書籍(如紅龍書)對我來說看起來有點過分。

或者也許有人可以在這里給我一些簡單的規則。

你真正應該做的是為你的語言寫一個語法。 一旦你有了,邊界很容易:

  • 詞法分析員負責接收您的輸入並告訴您有哪個終端
  • 解析器負責將一系列終端 終端重復匹配到生產規則,直到您有解析樹或解析失敗。

詞法分析器不負責輸入驗證,除非拒絕不可能的字符和其他非常基本的位。 解析器完成所有這些。

請查看http://www.cs.rochester.edu/~nelson/courses/csc_173/grammars/parsing.html 這是一個關於解析的介紹CS課程頁面。

決定是否應該由解析器或詞法分析器完成某項操作的一個很好的試金石是問自己一個問題:

語法是否具有任何遞歸,嵌套,自相似的元素?
(例如嵌套括號,大括號,標簽,子表達式,子句等)。

如果沒有,普通正則表達式就足夠了,它可以由詞法分析器完成。
如果是的話,它應該由解析器進行分析,因為它至少是一個無上下文的語法。

Lexer通常用於查找您的語言的“單詞”,並對它們進行分類(它是一個名詞嗎?一個動詞?一個形容詞?等等)。
解析器用於找到合適的“句子”,如果它們是給定語言中的正確句子,則將它們結構化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM