Question

Je garde le poste / réduit les erreurs. Enfin, je pense avoir rencontré mon match.

Int[] a
a[0] = 1

Le problème est int [] est défini comme

Type OptSquareBrackets

alors qu'un [0] est défini comme

Var | Var '[' expr ']'

Var et Type sont définis en tant que VAR qui est une variable valide [a-zA-Z] [a-zA-Z0-9 _] . Mis à part l'ajout d'un jeton factice (tel que ** Décl **, tapez OptSquareBrackets à la place), y a-t-il un moyen d'écrire cela pour ne pas avoir de conflit? À partir de cette règle, je reçois 1 quart de travail / réduire et 1 réduire / réduire les avertissements.

Était-ce utile?

La solution

Pourriez-vous définir un nouveau jeton

VarLBracket [a-zA-Z][a-zA-Z0-9_]*\[

Et donc définir la déclaration

Type | VarLBracket ']';

et définissez la cible de l'affectation comme

Var | VarLBracket expr ']';

Autres conseils

Créez une règle Lex avec [] car [] n'est utilisé que dans la déclaration et partout ailleurs on utiliserait [var]

Techniquement, ce problème provient de la tentative de lier la grammaire à une signification sémantique dont la syntaxe ne diffère pas réellement.

ISTM nécessite uniquement une structure grammaticale décrivant à la fois les types et les expressions. Faites la distinction dans le code et non dans la grammaire, surtout s’il n’ya pas réellement de différence syntaxique. Yacc est appelé un générateur de compilateur mais ce n’est pas le moins du monde vrai. Il fait juste des analyseurs.

Ceci étant dit, reconnaître [] comme symbole de terminal pourrait être un moyen plus simple de résoudre le problème et de faire avancer les choses. Yacc n’est pas très doué pour les grammaires ambiguës et il doit donc décider très tôt du chemin à suivre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top