Seventh, le micro langage impératif de ZDS !

Parce que les lisp-like, c'est cool, mais on aime aussi l'impératif nous !

a marqué ce sujet comme résolu.

Ça dépend. Soit vous décrivez dans le parser le point virgule comme un séparateur d'instruction, et il n'y en a pas besoin si l'instruction est la seule du bloc, soit c'est un terminateur et il en faut un. Dans le premier cas, en général on précise aussi qu'un bloc peut se terminer par un point virgule supplémentaire, mais il est optionnel.

Non c'est pas une erreur. En Pascal le if ne prend qu'une instruction et ne doit pas terminer par un point virgule sinon il considère que tu veux finir le if. Pour mettre plusieurs lignes ils faut entourer l'élément de begin / end. Dans un bloc le point virgule sert à séparer les instructions et le dernier est optionnel.

Édit pour comparaison en C tu en met pas non plus si tu ne délimite pas le bloc par des accolade

+0 -0

En C, le point virgule est un terminateur d'instruction : il y en a toujours un.

Sinon, c'est ok : dans notre langage, le point-virgule est donc un séparateur et non un délimiteur.

Pour voir si j'ai bien compris, on pourrait écrire le code précédent comme ça :

1
2
3
4
5
6
7
function factorielle(n)
begin
  if n <= 1 then
    factorielle = 1
  else
    factorielle = n*factorielle(n - 1);
end

C'est bien ça ?

+0 -0

Vous semblez vous prendre la tête beaucoup plus que de raison sur la syntaxe. Pourquoi ne pas en prendre une simple et déjà écrite en suivant une proposition qui vous a déjà été faite ? Elle a l'avantage à la fois d'être raisonnable de fait, et de servir précisément a écrire un parser pas trop compliqué sans pour autant que ce soit trivial, ce qui est ce que vous cherchez. Vous n'avez pas besoin de suivre le reste du cours si vous voulez faire autrement, mais là vous êtes en train de perdre un temps incroyable à discuter des points qui n'ont vraiment aucun intérêt…

+1 -1

Vous savez pourquoi j'aime le C++ ? Pour ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
template<typename DerivedBinaryExpression, typename LhsT = ExpressionNode, typename RhsT = ExpressionNode,
         typename = typename std::enable_if_t<std::is_base_of<ExpressionNode, LhsT>::value && std::is_base_of<ExpressionNode, RhsT>::value>>
class ConcreteBinaryExpressionNode : public ConcreteNode<ConcreteBinaryExpressionNode<DerivedBinaryExpression, LhsT, RhsT>, BinaryExpressionNode>
{
public:
    ConcreteBinaryExpressionNode(std::unique_ptr<LhsT>&& lhs, std::unique_ptr<RhsT>&& rhs);

private:
    std::unique_ptr<LhsT> m_lhs;
    std::unique_ptr<RhsT> m_rhs;
};
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte