2015-04-04 92 views
2

在語法中(例如,LL(1)),表示帶符號的符號。在實踐中,我不明白這個符號是什麼。爲了理解,我需要一個簡單實用的例子。什麼是lookahead符號?

+0

這樣的超前是由一些處理器解釋爲「命令一樣」的符號。它允許提前瀏覽,以便讀取和評估輸入流的一部分_而不實際轉發stream_的位置。作爲一種效果,下一次讀取操作將讀取相同的序列。好處:你可以預先看到你對輸入的期望。對不起,目前沒有例子... – arkascha 2015-04-04 08:33:08

+0

似乎是[編程器的StackExchange]的一個問題(http://programmers.stackexchange.com/) – 2015-04-04 08:53:40

回答

4

LL(1)語法幫助您立即決定哪個語法規則您將使用。這一個超前標記意味着你只需要閱讀當前正在閱讀的字符中的下一個字符。

LL(1)語法可以幫助您將複雜度降低到O(n),並且在解析輸入時沒有回溯。

Wikipedia Example

%是正在閱讀的字符和輸入字符串爲(a + a)

甲LL(1)的語法:

S -> F (Rule1) 

S -> (S + F) (Rule2) 

F -> a (Rule3) 

分析表是:

( ) a + $ 
S 2 - 1 - - 
F - - 3 - - 

然後,你必須:

%(a + a)(讀取字符串的開始和先行是(,所以決定根據分析表)

抽象語法樹適用規則2現在是:

  S 
     // | \ \ 
     ( S + F ) 

然後你消耗(。而且你繼續以同樣的方式。

第2步:

  S 
     // | \ \ 
     ( S + F ) 
      | 
      F 
      | 
      a 

第3步:

  S 
     // | \ \ 
     ( S + F ) 
      | | 
      F a 
      | 
      a 

你可以看到,在完全相同的方式使用堆棧,而不是一個抽象語法樹維基百科的例子。

+2

Nitpick:lookahead的單位是標記,而不是字符。令牌可能由多個字符組成。 – 2015-04-04 13:22:31