Skip to content

oubaydos/cashScript-Compiler

Repository files navigation

cashScript-Compiler

Ce projet est le fruit des conseils et des critiques bienveillantes d’un grand nombre de personnes. Nous tenons à les remercier ici et leur faire part de toutes nos gratitudes, pour avoir été à l’écoute et toujours d’une aide précieuse. Plus particulièrement, nous souhaitons adresser à travers ces courtes lignes nos remerciements les plus sincères à nos professeurs M. Youness Tabii et M. Rachid Oulad Haj Thami, qui ont eu le soin d’examiner et encadrer ce travail et ainsi nous offrir une véritable opportunité d’apprentissage. Enfin, nos remerciements s’adressent aux professeurs et au corps administratif de l’Ecole Nationale Supérieure de l’Informatique et de l’Analyse des Systèmes ENSIAS.

Description de langage

CashScript est un langage de programmation de haut niveau pour les contrats intelligents sur Bitcoin Cash. Il offre une couche d'abstraction solide sur la machine virtuelle native de Bitcoin Cash, Bitcoin Script. Sa syntaxe est basée sur le langage de contrat intelligent Solidity d'Ethereum, mais sa fonctionnalité est très différente puisque les contrats intelligents sur Bitcoin Cash diffèrent grandement des contrats intelligents sur Ethereum.

Description de langage

Types

  • Boolean :true ou false
  • Integer
  • Bytes :séquence de bits
  • String
  • datasig :Séquence de bytes représentant une signature de données
  • sig : Séquence de bytes représentant une signature de transaction.
  • pubkey :Séquence de bytes représentant une clé publique

Structures de contrôle

  • if (condition){body} else{}
  • while (condition){body}

Les instruction de saisi/affichage de base

  • print(variable)
  • input(variable)

La liste des tokens

  • ’while’ WHILE_TOKEN
  • ’print’ ECRIRE_TOKEN
  • ’input’ LIRE_TOKEN ‘date(’ DATE_TOKEN
  • ’/*’ CO_TOKEN
  • ’*/’ CF_TOKEN
  • ’//’ ∼[\r\n]* COMMENTAIRE_LIGNE_TOKEN
  • ’/’ . ? ’*/’ COMMENTAIRE_TOKEN
  • EOF EOF_TOKEN
  • ’true’ TRUE_TOKEN
  • ’false’ FALSE_TOKEN
  • ’satoshis’ SATOSHIS_TOKEN
  • ’sats’ SATS_TOKEN
  • ’finney’ FINNEY_TOKEN
  • ’bits’ BITS_TOKEN
  • ’bitcoin’ BITCOIN_TOKEN
  • ’seconds’ SECONDS_TOKEN
  • ’minutes’ MINUTES_TOKEN
  • ’hours’ HOURS_TOKEN
  • ’days’ DAYS_TOKEN
  • ’weeks’ WEEKS_TOKEN [-] ?[0-9]+ ([eE] [0-9]+) NOMBRE_LITTERAL_TOKEN
  • ’bytes’ BYTES_TOKEN
  • ’"’ GUILLEMET_TOKEN
  • ’\” sGUILLEMET_SIMPLE_TOKEN
  • ^[^’"]*$ _VALEUR_TOKEN
  • ’0’ [xX] [0-9A-Fa- f]* HEX_LITTERAL_TOKEN
  • ’tx.age’ TX_AGE_TOKEN
  • ’tx.time’ TX_TIME_TOKEN
  • ’tx.version’ TX_VERSION_TOKEN
  • ’tx.hashPrevouts’ TX_HASHPREVOUTS_TOKEN
  • ’tx.hashSequence’ TX_HASHSEQUENCE_TOKEN
  • ’tx.outpoint’ TX_OUTPOINT_TOKEN
  • ’tx.bytecode’ TX_BYTECODE_TOKEN
  • ’tx.value’ TX_VALUE_TOKEN
  • ’tx.sequence’ TX_SEQUENCE_TOKEN
  • ’tx.hashOutputs’ TX_HASHOUTPUTS_TOKEN
  • ’tx.locktime’ TX_LOCKTIME_TOKEN
  • ’tx.hashtype’ TX_HASHTYPE_TOKEN
  • ’tx.preimage’ TX_PREIMAGE_TOKEN
  • [a-zA-Z] [a-zA-Z0-9_]* IDENTIFIANT_TOKEN
  • [ \t\r\n\u000C] ESPACE_TOKEN
  • ’pragma’ PRAGMA_TOKEN
  • ’ ;’ POINT_VIRGULE_TOKEN
  • ’.’ POINT_TOKEN
  • ’cashscript’ CASHSCRIPT_TOKEN
  • ’^’ OPERATEUR_BINAIRE_XOR_TOKEN
  • ’∼’ OPERATEUR_BINAIRE_NON_TOKEN
  • ’>=’ OPERATEUR_SUPEG_TOKEN
  • ’>’ OPERATEUR_SUP_TOKEN
  • ’<’ OPERATEUR_INF_TOKEN
  • ’<=’ OPERATEUR_INFEG_TOKEN
  • ’=’ OPERATEUR_EG_TOKEN
  • ’contract’ CONTRAT_TOKEN
  • ’{’ ACCOLADE_O_TOKEN
  • ’}’ ACCOLADE_F_TOKEN
  • ’function’ FONCTION_TOKEN
  • ’(’ PARENTHESE_O_TOKEN
  • ’,’ VIRGULE_TOKEN
  • ’)’ PARENTHESE_F_TOKEN
  • ’require’ REQUIRE_TOKEN
  • ’require_time’ REQUIRE_TIME_TOKEN
  • if ’ SI_TOKEN
  • ’else’ SINON_TOKEN
  • new’ NOUVEAU_TOKEN
  • ’[’ CROCHET_O_TOKEN
  • ]’ CROCHET_F_TOKEN
  • ’.reverse()’ INVERSER_TOKEN
  • ’.length’ TAILLE_TOKEN
  • ’ !’ OPERATEUR_NON_TOKEN
  • ’-’ OPERATEUR_MOINS_TOKEN
  • ’.split’ SPLIT_TOKEN
  • ’/’ OPERATEUR_DIVISER_TOKEN
  • ’%’ OPERATEUR_MODULO_TOKEN
  • ’+’ OPERATEUR_PLUS_TOKEN
  • ’*’ OPERATEUR_FOIS_TOKEN
  • ’==’ OPERATEUR_EGAL_TOKEN
  • ’ !’ OPERATEUR_DIFFERENT_TOKEN
  • ’&’ OPERATEUR_BINAIRE_ET_TOKEN
  • ’|’ OPERATEUR_BINAIRE_OU_TOKEN
  • ’&&’ OPERATEUR_ET_TOKEN
  • ’||’ OPERATEUR_OU_TOKEN
  • ’int’ TYPE_ENTIER_TOKEN
  • ’bool’ TYPE_BOOLEAN_TOKEN
  • ’string’ TYPE_STRING_TOKEN
  • ’pubkey’ TYPE_CLE_PUBLIQUE_TOKEN
  • ’sig’ TYPE_SIGNATURE_TOKEN
  • ’datasig’ TYPE_SIGNATURE_DONNEE_TOKEN

Les règles de production

  • PROGRAMME : DIRECTIVE_PRAGMA* DEFINITION_CONTRAT EOF_TOKEN ;
  • DIRECTIVE_PRAGMA : PRAGMA_TOKEN CASHSCRIPT_TOKEN VALEUR_PRAGMA POINT_VIRGULE_TOKEN ;
  • VALEUR_PRAGMA : CONTRAINTE_VERSION [CONTRAINTE_VERSION | eps] ;
  • CONTRAINTE_VERSION : [OPERATEUR_VERSION | eps] VERSION_LITTERALE_TOKEN ; *OPERATEUR_VERSION : OPERATEUR_BINAIRE_XOR_TOKEN | OPERATEUR_BINAIRE_NON_TOKEN | OPERATEUR_SUPEG_TOKEN | OPERATEUR_SUP_TOKEN | OPERATEUR_INF_TOKEN | OPERATEUR_INFEG_TOKEN | OPERATEUR_EG_TOKEN ;
  • DEFINITION_CONTRAT : CONTRAT_TOKEN IDENTIFIANT_TOKEN LISTE_PARAMETRE ACCOLADE_O_TOKEN {DEFINITION_FONCTION} ACCOLADE_F_TOKEN ;
  • DEFINITION_FONCTION : FONCTION_TOKEN IDENTIFIANT_TOKEN LISTE_PARAMETRE ACCOLADE_O_TOKEN {DECLARATION} ACCOLADE_F_TOKEN ;
  • LISTE_PARAMETRE : PARENTHESE_O_TOKEN [(PARAMETRE (VIRGULE_TOKEN PARAMETRE)* [VIRGULE_TOKEN | eps])| eps] PARENTHESE_F_TOKEN ;
  • PARAMETRE : NOM_TYPE IDENTIFIANT_TOKEN ;
  • BLOC : ACCOLADE_O_TOKEN DECLARATION* ACCOLADE_F_TOKEN | DECLARATION ;
  • DECLARATION : DEFINITION_VARIABLE| AFFECTATION| TEMPS_DECLARATION | requireStatement| SI | WHILE | ECRIRE | LIRE ;
  • DEFINITION_VARIABLE : NOM_TYPE IDENTIFIANT_TOKEN OPERATEUR_EG_TOKEN EXPRESSION POINT_VIRGULE_TOKEN ;
  • AFFECTATION : IDENTIFIANT_TOKEN OPERATEUR_EG_TOKEN EXPRESSION POINT_VIRGULE_TOKEN ; TEMPS_DECLARATION : REQUIRE_TIME_TOKEN PARENTHESE_O_TOKEN TX_VAR_TOKEN OPERATEUR_SUPEG_TOKEN EXPRESSION PARENTHESE_F_TOKEN POINT_VIRGULE_TOKEN ;
  • requireStatement : REQUIRE_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN POINT_VIRGULE_TOKEN ;
  • SI : SI_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN BLOC [(SINON_TOKEN BLOC)| eps] ;
  • LITTERAL : BOOLEAN_LITTERAL_TOKEN | NOMBRE_LITTERAL | STRING_LITTERAL_TOKEN | DATE_LITTERAL | HEX_LITTERAL_TOKEN ;
  • LISTE_EXPRESSIONS : PARENTHESE_O_TOKEN [(EXPRESSION (VIRGULE_TOKEN EXPRESSION)* [VIRGULE_TOKEN| eps])| eps] PARENTHESE_F_TOKEN ;
  • EXPRESSION : PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN | NOM_TYPE PARENTHESE_O_TOKEN EXPRESSION [(VIRGULE_TOKEN EXPRESSION) | eps] [VIRGULE_TOKEN| eps] PARENTHESE_F_TOKEN | NOUVEAU_TOKEN IDENTIFIANT_TOKEN LISTE_EXPRESSIONS | IDENTIFIANT_TOKEN [[LISTE_EXPRESSIONS | INVERSER_TOKEN | TAILLE_TOKEN | (CROCHET_O_TOKEN NOMBRE_LITTERAL_TOKEN CROCHET_F_TOKEN) | (SPLIT_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN ) | DEUXIEME_EXPRESSION_BINAIRE] | eps ] | LITTERAL [ [INVERSER_TOKEN | TAILLE_TOKEN | (CROCHET_O_TOKEN NOMBRE_LITTERAL_TOKEN CROCHET_F_TOKEN) | (SPLIT_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN ) | DEUXIEME_EXPRESSION_BINAIRE] | eps ] | (OPERATEUR_NON_TOKEN | OPERATEUR_MOINS_TOKEN) EXPRESSION | CROCHET_O_TOKEN [(EXPRESSION (VIRGULE_TOKEN EXPRESSION)* [VIRGULE_TOKEN | eps]) | eps] CROCHET_F_TOKEN | CHAMP_AVANT_IMAGE_TOKEN -NOMBRE_LITTERAL : NOMBRE_LITTERAL_TOKEN [UNITE_TOKEN| eps] ;
  • NOM_TYPE : TYPE_ENTIER_TOKEN | TYPE_BOOLEAN_TOKEN | TYPE_STRING_TOKEN | TYPE_CLE_PUBLIQUE_TOKEN | TYPE_SIGNATURE_TOKEN | TYPE_SIGNATURE_DONNEE_TOKEN | BYTES ;
  • BYTES : BYTES_TOKEN [[[1-9] [0-9]*] | eps] ;
  • DATE_LITTERAL : DATE_TOKEN STRING_LITTERAL_TOKEN PARENTHESE_F_TOKEN ;
  • WHILE : WHILE_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN BLOC ;
  • ECRIRE : ECRIRE_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN POINT_VIRGULE_TOKEN ;
  • LIRE : LIRE_TOKEN IDENTIFIANT_TOKEN PARENTHESE_F_TOKEN POINT_VIRGULE_TOKEN ;
  • COMMENT : CO_TOKEN .* CF_TOKEN ;
  • LINE_COMMENT : COMMENTAIRE_LIGNE_TOKEN ∼[\r\n]* ;
  • VERSION_LITTERALE_TOKEN : NOMBRE_LITTERAL_TOKEN POINT_TOKEN NOMBRE_LITTERAL_TOKEN POINT_TOKEN NOMBRE_LITTERAL_TOKEN ;
  • BOOLEAN_LITTERAL_TOKEN : TRUE_TOKEN | FALSE_TOKEN ;
  • UNITE_TOKEN : SATOSHIS_TOKEN | SATS_TOKEN | FINNEY_TOKEN | BITS_TOKEN | BITCOIN_TOKEN | SECONDS_TOKEN | MINUTES_TOKEN | HOURS_TOKEN | DAYS_TOKEN | WEEKS_TOKEN ;
  • STRING_LITTERAL_TOKEN : [ GUILLEMET_SIMPLE_TOKEN STRING_VALEUR_TOKEN GUILLEMET_SIMPLE_TOKEN ] | [ GUILLEMET_TOKEN STRING_VALEUR_TOKEN GUILLEMET_TOKEN ] ;
  • TX_VAR_TOKEN : TX_AGE_TOKEN|TX_TIME_TOKEN ;
  • CHAMP_AVANT_IMAGE_TOKEN :TX_VERSION_TOKEN| TX_HASHPREVOUTS_TOKEN | TX_HASHSEQUENCE_TOKEN| TX_OUTPOINT_TOKEN | TX_BYTECODE_TOKEN| TX_VALUE_TOKEN| TX_SEQUENCE_TOKEN| TX_HASHOUTPUTS_TOKEN | TX_LOCKTIME_TOKEN| TX_HASHTYPE_TOKEN| TX_PREIMAGE_TOKEN

Utilisation

pour utiliser le compilateur vous devez au dossier tests le programme sous le nom test.cash et le compilé parl'utilisation de : cmake voir : comment utiliser cmake

About

a cashscript Compiler with extra grammar

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •