Tâche:
Vous devez créer un interpréteur capable d'analyser les extraits d'un langage de programmation. Le langage n'a pas besoin d'être complexe, mais il doit inclure les éléments syntaxiques suivants:
- Capacité d'assigner et de lire des variables (peut être aussi simple que
a
-z
être des variables prédéfinies) - Si des instructions (elseif et else ne sont pas requises)
- Boucles (comptant jusqu'à un nombre arbitraire, l'accès utilisateur au compteur n'est pas requis)
- Mathématiques simples avec variables (addition, soustraction, multiplication, division, supérieur / inférieur à, égal)
- Imprimer les relevés
Règles:
- Vous ne pouvez pas copier la syntaxe d'une autre langue populaire.
- Vous devez écrire votre propre interprète, pas la modification d'un autre interprète.
- Vous pouvez écrire votre interprète dans n'importe quelle langue.
- Écrivez un exemple de programme de 99 bouteilles de bière dans votre langue (voir ici )
- Il s'agit d'un concours de popularité , donc la réponse la plus votée l'emporte.
popularity-contest
interpreter
parsing
Le docteur
la source
la source
Réponses:
DogeScript
Le programme des 99 bouteilles de bière:
L'interpréteur PHP:
La syntaxe telle qu'elle existe actuellement:
Essayez-le ici .
Toute suggestion d'amélioration est la bienvenue.
la source
BrainBack: un langage compilé basé sur la pile fonctionnant sur BrainFuck
NB: La spécification a été changée de "créer un analyseur" à "créer un interprète" après avoir posté cette réponse. Cette réponse est un compilateur qui analyse également le code source.
Le nom est un jeu de mots sur Back étant l'opposé d'un langage basé sur la pile bien connu et Brain indiquant sa nature ésotérique. Cela ressemble un peu à BrainFuck (bien que ce ne soit pas le cas), mais son compilateur fonctionne sur BrainFuck et son code objet compilé se termine en tant que binaires BrainFuck.
Le langage: * == détruit ses arguments
"constant"
imprime constant#
imprime le haut de la pile sous forme de nombre>
duplique le haut de la pile<num>
pousser le nombre constant en<num>
tant que valeur en haut de la pile<
retirer le haut de la pile-
soustraire le plus haut du deuxième plus haut *+
ajouter le plus haut au deuxième plus haut *!
ne bascule pas positif / zéro *[ ... ]
fait un moment en haut de la pile non nul, très similaire à BrainFuck99 bouteilles de bière avec des paroles correctes dans BrainBack:
Le compilateur BrainBack, écrit en Extended BrainFuck
Pour compiler BrainBack:
Pour compiler un programme BrainBack:
Exécutez le binaire:
Ici, j'utilise bf qui est disponible dans la plupart des distributions debian.
beef
et d'autres peuvent également être utilisés. Le compilateur EBF, BrainBack et son code objet deviennent des binaires BrainFuck tout à fait compatibles.Il devrait probablement être étendu pour imprimer une cellule en ascii
.
, pouvoir lire un octet,
et avoir diversesswap
opérations pour être plus utile. Il est absolument nécessaire pour créer un compilateur ou un interprète BrainBack dans BrainBack.la source
€
Je passe la plupart de mon temps sur des scripts PHP et cela m'a posé une question: pourquoi suis-je obligé d'utiliser
$
pour les noms de mes variables?€
est ma monnaie locale, alors utilisons-la! Étant donné que € est utilisé dans de nombreux pays, j'ai utilisé certains mots des langues de l'UE comme mots clés.Mots clés:
gleich
est égal en allemandmientras
est tout en espagnoltopo
est plus grand en portugais (mise à jour: il devrait être maior à la place, merci à daHugLenny pour l'astuce)odejmowanie
est soustraire en polonaisafficher
est imprimé en françaisnl
parfois appelés , et le TLD l'NETHERLANDS
estnl
, j'ai donc défini une constanteNETHERLANDS
pour afficher les retours à la ligneJ'ai un peu triché puisqu'il n'y a pas de
if
mot-clé, j'ai choisi d'imprimer directement les deux dernières lignes.Interprète en Python
L'interprète ne fera pas plus qu'exécuter le script pour afficher 99 bouteilles de bières.
Pour l'exécuter, enregistrez les deux fichiers puis exécutez le fichier Python avec le
.eu
script comme argument:la source
topo
est top en portugais1Lang
1Lang est un langage de préfixe fonctionnel comme LISP ou Scheme mais sans parenthèses qui le rend un peu plus difficile à lire lorsque tous les espaces blancs inutiles sont supprimés. Les parenthèses peuvent être supprimées car toutes les fonctions et opérateurs prennent un nombre connu de paramètres.
Les accolades sont nécessaires pour délimiter le corps de la fonction et la conséquence conditionnelle et les blocs de code alternatifs qui peuvent consister en une liste d'instructions.
Dans LISP, Factorial pourrait être défini comme ceci:
dans 1Lang ce serait
qui peut être réduit à
1Lang ne prend actuellement en charge aucun effet secondaire.
1Lang est écrit en bash donc il partage actuellement certaines limitations bash telles que la plage d'entiers.
NB: Les listes ne sont pas entièrement mises en œuvre.
Les entiers sont des entiers bash (jusqu'à -2 ^ 32 à 2 ^ 31-1 je pense). Les nombres négatifs ne peuvent pas être utilisés directement. Pour saisir un négatif, soustrayez-le de zéro. par exemple. -5 serait entré comme -0 5. Cette limitation est due au fait que 1Lang est un travail en cours et les nombres négatifs n'étaient pas nécessaires pour cette application. J'envisage d'utiliser ~ comme opérateur négatif unaire qui permettrait à -5 d'être entré comme ~ 5.
Un espace blanc est nécessaire pour délimiter des entiers. par exemple. +2 3
Les noms des paramètres de fonction peuvent surcharger les variables des appelants. Toutes les variables affectées dans une fonction sont locales.
L'impression n'est pas nécessaire (bien qu'elle puisse être utile) car, comme LISP, chaque instruction renvoie une valeur et la dernière valeur renvoyée est imprimée.
Un comportement inattendu de la notation de préfixe sans parenthèses est que la concaténation de chaînes peut en fait être facile à écrire. Dites que vous voulez concaténer
"a" " quick" " brown" " fox"
, on pourrait écrire:Mais une méthode plus lisible et moins sujette aux erreurs est la suivante:
ou
99 Bouteilles de code de bière:
La fonction B renvoie "Plus de bouteilles" ou "1 bouteille" ou "bouteilles" selon x.
La fonction F renvoie des versets normaux ou finaux. Un verset normal est concaténé avec le verset suivant en appelant récursivement F avec -x1. Lorsque x est 0, F renvoie le dernier couplet.
Cela génère (pour F5 signifiant commencer à 5 bouteilles de bière ...):
1Lang interprète (écrit en bash) en moins de 500 lignes.
la source
@Mfxy{fxy}M+3 4
fonctionné, mais vous devez ensuite rejoindre la fonction et l'espace de noms des variables. Il a fallu du temps pour calculer 99 bières: pcons
vous pouvezmap
M\x{*x2}C1C2C3C4/ => (2 4 6 8)
Demi (interprète / traducteur dans Windows Batch)
Je ne sais pas pourquoi je réponds à tant d'énigmes dans le lot de fenêtres, pour une raison malade, je pense que je l'apprécie: P Quoi qu'il en soit, cela ressemble à quelque chose sur lequel j'ai travaillé pour le plaisir il y a quelque temps, un langage de base qui est traduit en lot de fenêtres par un script qui est également écrit en lot de fenêtres. Ce n'est pas particulièrement étonnant, mais ça marche.
99 bouteilles de bière
Syntaxe
Seuls trois jetons sont reconnus sur chaque ligne, séparés par des espaces.
# est un commentaire.
Dans la plupart des cas où une valeur est nécessaire, a
$
dans le deuxième jeton signifie que le troisième doit être traité comme un nom de variable, tandis que a~
désigne une valeur littérale. Les instructions générales prennent la forme<instruction> [$~] <name>
. La définition d'une variable prend la même forme, mais est implémentée chaque fois qu'elle n'est pas reconnue.Commandes définies:
print
et leswrite
deux écrivent la sortie, maiswrite
n'ajoutent pas de nouvelle ligne. Besoin de $ ou ~.mark
crée un point qui peut être sauté ou appelé comme sous-programme.jump
équivalent de goto en batch (ou n'importe quelle langue d'ailleurs).proc
appelle un sous-programme. Équivalent decall :label
.return
revient d'un sous-programme. Quittera le programme lorsque vous n'en serez pas à l'intérieur.if
instruction conditionnelle. Prend la comparaison de la ligne suivante, dans le formulaire<var1> <operator> <var2>
. Les opérateurs sont les mêmes que ceuxif
du lot, c'est-à-dire.EQU, NEQ, LSS, LEQ, GTR, GEQ
. Exécute les instructions après uniquement si la comparaison est vraie.endif
termine une instruction if.cat
concatène deux variables.cat a b
stockera la valeur de ab dans a.Lorsqu'aucune de ces commandes n'est trouvée, l'expression est traitée comme une affectation de variable, en utilisant le premier jeton comme nom de variable.
$
et~
se comportent de la même manière que dansprint
, mais il existe également un@
identifiant. Cela traite le dernier jeton comme une expression mathématique passée àset /a
. Il comprend la plupart des opérateurs. Si aucun des trois identifiants n'est trouvé, il s'agit d'une erreur de syntaxe et l'interpréteur se ferme.Interprète (Windows Batch)
L'interprète traduit réellement le code en lot de fenêtres, le place dans un fichier temporaire et l'exécute. Bien qu'il reconnaisse les erreurs de syntaxe dans la langue Half, le script de commandes résultant peut provoquer des problèmes, en particulier avec des caractères spéciaux comme les parenthèses, les barres verticales, etc.
la source
Flex Bison
Attribuer une variable, sinon un bloc de condition et une autre addition, opération de soustraction.
Fichier laxical
lex.l
Fichier analyseur
com.y
Compiler
Courir
compilateur in.txt ou.txt
Fichier d'entrée
a = 3 + (4 * 7) -9; imprimer un; c = a + 45; imprimer c;
** Ceci est un commentaire sauf c;
** enregistrer c dans le fichier imprimer c * (a + 32);
Fichier de sortie 67
la source
Interprète
Pour obtenir des instructions sur la façon d'exécuter ce code, consultez mon autre réponse: /codegolf//a/19935/13186
99 bouteilles de bière
Le programme
la source
99ISC
99ISC utilise une mémoire orientée entier de taille arbitraire. La mémoire est indexée par un entier non négatif. Toutes les valeurs en mémoire sont initialisées avec leur adresse. Par exemple. Au moment de l'exécution, l'adresse 0 contient la valeur 0 et l'adresse 9 contient la valeur 9.
99ISC a deux instructions. Le premier imprime la routine des 99 bouteilles de bière sur le mur. Sa syntaxe est une seule ligne, comme ci-dessous. L'exécution se poursuit avec la ligne suivante du programme.
La deuxième instruction est une instruction "soustraire et dériver si elle n'est pas égale à zéro". Sa syntaxe est une seule ligne, comme ci-dessous.
x
est l'adresse du nombre à opérer,y
est l'adresse du nombre soustrait etz
est la ligne suivante à exécuter si le résultat de la soustraction n'est pas nul. Sinon, l'exécution se poursuit avec la ligne suivante.La présence de l'instruction "soustraire et dériver si elle n'est pas nulle" fait de 99ISC un OISC (One Instruction Set Computer) et donc de Turing complet.
Voici un programme qui efface les 10 premières valeurs en mémoire, puis imprime la routine 99 bouteilles de bière sur le mur.
Et voici un interpréteur 99ISC, en Python.
la source
Je te donne:
Interprète de petits ensembles d'instructions (SISI)
La syntaxe s'appuie sur BASIC et sur assembly. Il dispose de quatre déclarations:
set
,print
,jump
(goto sans conditions), etjumpif
(goto conditionnelle). Chaque instruction doit être précédée d'un numéro de ligne. Les types de données pris en charge sont des entiers et des chaînes.L'interpréteur lui-même peut être trouvé dans Python 3 sur Github (sisi.py). Le programme 99 bouteilles de bière existe également, mais je vais le reproduire ici:
la source
Pogo
https://github.com/nrubin29/Pogo
la source
i
et le fixe à 99. Ensuite, alors que i est supérieur à 0, j'imprimei bottles of beer on the wall
et soustrais uni
. Si le problème est que je manque certaines paroles, je peux en ajouter d'autres.