1

Ich kann die Mehrdeutigkeit in der folgenden Regel enthalten sind, zu lösen scheinen:Resolve Mehrdeutigkeit von Grammatik für C Initialisierungsliste

InitializerList_a → [Initializer] [InitializerList_a]

Es hat eine Verschiebung verursacht/reduzieren Konflikt in meinem Parser (Ich benutze Bison). Das Folgende ist seine Schließung:

InitializerList_a → ε 

Initializer → [Constant] 

Initializer → {[InitializerList][Initializer_a] 

Initializer_a → } 

Initializer_a → ,} 

InitializerList → [Initializer][InitializerList_a] 

Jede Hilfe wäre willkommen. Ich kann die Bison-Ausgabedatei bei Bedarf veröffentlichen.

Hier ist die gleiche Grammatik in einer lesbaren Form geschrieben:

L → IT 

T → ,IT | ε 

I → [Constant] | {LA 

A → } | ,} 

where [Constant] is a terminal 

Antwort

0

Dies sollte es abdecken. YACC-ähnliche Grammatiken bevorzugen eine Kopfrekursion über eine Schwanzrekursion in der Grammatik.

%start I 
%token CONSTANT 
%% 
I: CONSTANT | '{' L '}' ; 
L: J | J ',' ; 
J: I | J ',' I ; 
+0

Vielen Dank, aber welche Nicht-Terminal aus der ursprünglichen Grammatik entspricht J? Oder ist es ein neues Nicht-Terminal? –

+0

Wahrscheinlich 'T'. Ich habe es nur geflucht. – jxh

+0

das ist nicht korrekt .. könnten Sie es erneut versuchen? Die Grammatik dient zur Initialisierung einer Variablen/eines Arrays. z.B. i = 1 oder i = {1, 2, 3, 4} –