我有這個語法,我已經計算了第一個集合,但我不確定如何顯示我的工作方式,因爲顯示給我的方法我覺得太混亂了,但我理解如何獲取集合而不是如何顯示我的工作。 語法如下: S -> a a E | a E | S b ,
D -> E D d | c c | EPSILON ,
Y -> D E D | d ,
E -> a E D | EPSILON ,
我的第一組是: first(S) = {
所以我有一個家庭作業,我已經花了2個小時試圖找出爲什麼這個語法將不與LL解析器工作: <A> → a <B>
<A> → a b <C>
<B> → b d <D>
<C> → d <E>
<D> → m n
<E> → x y
可能有人請點我在正確的方向?我知道一個LL可能被絆倒的方式之一是,如果它遇到一個無限循環,我不相信它在這裏。 感謝
我目前正在手動構建解析器。它是一個LL(1)解析器。目前,它是一個了不起的識別器:它的函數解析(List令牌)決定了令牌是否是該語言的成員。 現在,我想爲該輸入構建相應的AST。但是,我知道如何以遞歸下降的方式實現它(已經做到了)。也就是說,面臨的挑戰,我使用堆棧與經典算法實現我的籌碼: next <- first token of the input
stack <- START_SYMBOL
我已導出的以下語法: S -> a | aT
T -> b | bR
R -> cb | cbR
我明白,爲了使一個語法是LL(1)它必須是無歧義的,右遞歸的。問題是我沒有完全理解左遞歸和右遞歸語法的概念。我不知道下面的語法是否是正確的遞歸。如果我的語法是LL(1),我會非常欣賞對左遞歸和右遞歸語法概念的簡單解釋。 非常感謝。