bonjour,
je suis dans les mathématiques discrètes.
je voudrais savoir si epsilon, la production vide, est à considérer comme un terminal dans le calcul des symboles improductifs d'une grammaire hors contextes.
une idée?
-----
bonjour,
je suis dans les mathématiques discrètes.
je voudrais savoir si epsilon, la production vide, est à considérer comme un terminal dans le calcul des symboles improductifs d'une grammaire hors contextes.
une idée?
Je m'y connais assez peu, mais il me semble que oui au vu de la définition, maintenant dans tous les cas hors du point de vue de la théorie la production vide ne me semble pas avoir un grand intérêt.
En passant, le sujet de cette discussion mériterait un autre nom ("mathématiques discrètes" étant très vague et assez trompeur, on ne s'attend pas tellement à trouver un sujet sur le parsing théorique là-dedans).
Voili voilou passez une bonne journée
Merci pour la réponse.
la production vide sert, entre autre, dans la suppression des récursivités à gauche:
sans la récursivité à gauche:Code:E -> E + T E -> nombre
elle sert aussi pour les symboles optionnelsCode:E -> nombre R R -> + T R R-> epsilon
Code:symboleopt -> symbole symboleopt -> epsilon
Effectivement, autant pour moi. J'oublie souvent (ayant abordé les grammaires du point de vue informatique, donc pratique) qu'il se cache toujours un coté théorique derrière la pratique (par contre je maintiens que a un usage quasi-exclusivement théorique).
Je dis ça notamment pour l'optionnel : Au lieu de :
E -> A
E ->
On écrit généralement :
E -> [A]
En EBNF (une sorte de langage pour la grammaire qui permet de simplifier, ce cas ci est un exemple parmi tant d'autres).
D'où le fait que je vois rarement, si ce n'est jamais, ce fameux . Merci pour les éclaircissements !
Dernière modification par Alphasaft ; 27/07/2022 à 21h53.
pour un A optionnel, on écrit pas plutôtCode:E ::= (A)?
C'est aussi ce que je pensais, mais après quelques recherches non ; peut être que c'est en BNF que c'est noté comme ça ?
l'epsilon-production n'apparaît pas explicitement pas mais il est sous-jacent
voici mon analyseur syntaxique, epsilon est cité à l'avant dernière ligne de code
Code:void syntaxique::anasynt(){ bool sayerror=true; symbole X; unilex a; terminal lex; a=L.analex(); for(X=pile.back();X!=sdolar;X=pile.back()) if(a.getlex()==dolar){ if(sayerror) std::cerr<<"fin de fichier prématurée"<<std::endl; exit(1); } else if(vaut[a.getlex()]==X){ lex=a.getlex(); a=L.analex(); pile.pop_back(); } else if(estterminal(X)){ if(sayerror) std::cerr<<"ligne "<<L.getligne()<<": "<<strsymb[X]<<" attendu. " <<strterm[a.getlex()]<<" indiqué"<<std::endl; pile.pop_back(); a=L.analex(); sayerror=false; } else if(M[X][a.getlex()].empty()){ if(sayerror){ std::cerr<<"ligne "<<L.getligne()<<": "<<erreur[X][a.getlex()] <<std::endl; std::cerr<<'\t'<<"X="<<"s"<<strsymb[X]<<std::endl <<'\t'<<"a="<<strterm[a.getlex()]<<":"<<a.getlexeme() <<std::endl; } sayerror=false; a=L.analex(); pile.pop_back(); } else if( (! M[X][a.getlex()].empty()) &&M[X][a.getlex()].front()==ssynchro){ if(sayerror){ std::cerr<<"ligne "<<L.getligne()<<": "<<erreur[X][a.getlex()] <<std::endl; std::cerr<<'\t'<<"X="<<"s"<<strsymb[X]<<std::endl <<'\t'<<"a="<<strterm[a.getlex()]<<"::"<<a.getlexeme() <<std::endl; } sayerror=false; pile.pop_back(); } else{ sayerror=true; std::cout<<strsymb[X]<<" -> "; for(auto s:M[X][a.getlex()]){ std::cout<<strsymb[s]<<" "; } std::cout<<std::endl; pile.pop_back(); for(int i=M[X][a.getlex()].size();i>0;i--) if(M[X][a.getlex()].front() != sepsilon) pile.push_back(M[X][a.getlex()][i-1]); } }
Dernière modification par essemme ; 29/07/2022 à 23h19.