簡體   English   中英

你如何解析上下文敏感的C代碼?

[英]How do you parse context-sensitive C-code?

我遇到的一個問題是C必須是上下文敏感的,並且無法使用一個前瞻標記進行解析。 例如

int main1;
int main() {}

這是我能想到的最簡單的例子,其中函數定義和變量聲明都以相同的標記類型開頭。 您必須一直向前看左邊的paren或分號以確定要解析的內容。

我的問題是,這是如何實現的? 詞法分析器是否有一些技巧可以進行前瞻,並發出一個區分兩者的隱形標記? 現代解析有很多前瞻性的標記嗎?

您應該閱讀LR或shift-reduce解析器。 他們自下而上組裝解析樹。 main功能的情況下,它像:

  • int作為TYPE終端令牌移入堆棧
  • main作為IDENTIFIER終端令牌移入堆棧
  • 轉移(進入堆棧
  • )到堆棧
  • 刪除()並替換為ARGLIST非終端令牌
  • 轉移{進入堆棧
  • }進棧
  • 刪除它們並替換為STMT_BLOCK非終端令牌
  • 刪除TYPE,IDENTIFIER,ARGLIST和STMT_BLOCK標記,並替換為FUNCTION_DEF標記。

當然,每次進行替換時,它都會構建一個新的解析樹片段並將其附加到新令牌上。 (我編寫了這些令牌名稱。)

它在有限狀態機的控制下工作,該有狀態機識別堆棧上的令牌模式,並與下一個(單個)輸入令牌一起決定是否移動下一個令牌,或者應用其中一個語法規則來減少堆棧上的令牌組成一個單一的。 FSM由解析器生成器根據語法規則列表構建。

它被稱為LR,因為它從左側讀取輸入令牌,但從右側應用語法規則。 它不同於LL或遞歸下降,它從左側應用語法規則。 Pascal是一種LL(1)語言。 C不是LL(1),因此需要LR(1)解析器。 例如,它允許C在嵌套括號中嵌入幾乎任何東西而不會混淆解析器。

我希望這能幫助你了解正在發生的事情。

暫無
暫無

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

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