Speeding Simplified Script Language: Difference between revisions
(→Notes) |
|||
(18 intermediate revisions by 2 users not shown) | |||
Line 6: | Line 6: | ||
=Les contraintes technologigues = |
=Les contraintes technologigues = |
||
* Python vers 3.5 |
* Python vers 3.5 |
||
* Python Abstract Syntax Trees |
* Python Abstract Syntax Trees https://docs.python.org/3/library/ast.html |
||
* [http://msgpack.org/index.html MessagePack] |
* [http://msgpack.org/index.html MessagePack] |
||
Line 17: | Line 17: | ||
** type de variable simple |
** type de variable simple |
||
= Divers = |
|||
= Piste de développement = |
|||
== Notes == |
|||
* L'indentation ne peut pas être traiter par un parser de type PEG (qui ne traite que ''context-free grammar'', |
|||
les langages comme Python sont ''context-sensitive grammar'' ) |
|||
- Voir http://stackoverflow.com/questions/4205442/peg-for-python-style-indentation |
|||
- On peurrendre explicite les blocs de code avec le module token avant de passer par le parser: |
|||
from tokenize import tokenize, untokenize, NAME, INDENT, DEDENT |
|||
from io import BytesIO |
|||
def indentation_explicitation(s): |
|||
result = [] |
|||
g = tokenize(BytesIO(s.encode('utf-8')).readline) # tokenize the string |
|||
for toknum, tokval, _, _, _ in g: |
|||
if toknum == INDENT: # replace NUMBER tokens |
|||
result.extend([ |
|||
(NAME, '<INDENT>') |
|||
]) |
|||
elif toknum == DEDENT: |
|||
result.extend([ |
|||
(NAME, '<DEDENT>') |
|||
]) |
|||
else: |
|||
result.append((toknum, tokval)) |
|||
return untokenize(result).decode('utf-8') |
|||
s = """ |
|||
def a(b): |
|||
if b: |
|||
print('yop') |
|||
else: |
|||
print('poy') |
|||
b = b + 1 |
|||
a(true) |
|||
""" |
|||
print(indentation_explicitation(s)) |
|||
Ce qui donne: |
|||
(env3.4)auguste@akira:~/work/15-16/kael (master)> python token_ex.py |
|||
def a (b ): |
|||
<INDENT> if b : |
|||
<INDENT> print ('yop') |
|||
<DEDENT> else : |
|||
<INDENT> print ('poy') |
|||
<DEDENT> b =b +1 |
|||
<DEDENT> a (true ) |
|||
== Liens utiles == |
|||
* AST: https://docs.python.org/3.4/library/ast.html |
|||
* Liste de parser en python: https://wiki.python.org/moin/LanguageParsing |
|||
* '''A Lire''' Parsing expression grammar ('''PEG''''): https://en.wikipedia.org/wiki/Parsing_expression_grammar |
|||
* '''Grako''' (A generator of PEG/Packrat parsers from EBNF grammars): https://pypi.python.org/pypi/grako/3.6.6 |
|||
** DOC: https://bitbucket.org/apalala/grako |
|||
** http://stackoverflow.com/questions/tagged/grako |
|||
** http://stackoverflow.com/tags/grako/info |
|||
* '''Arpeggio''' http://igordejanovic.net/Arpeggio/ |
|||
== Installation d'Astmonkey == |
|||
* Python 3.4 |
|||
* Installation de pydot |
|||
* Récupérer une archive de https://github.com/nlhepler/pydot |
|||
* Décompresser (unzip) et installer par '''python setup.py install''' |
|||
* Installer Astmonkey par '''pip install astmonkey''' |
Latest revision as of 08:53, 13 February 2016
Objectif
Le but à long terme de ce projet est de pouvoir partager des codes sources simples de différent langage de scripts, de permettre une execution efficace de ces codes par traduction en langage compilable et permettre l'interaction avec ce code compilé depuis les différents langages de script.
Dans un premier temps on se propose d'identifier un langage de script minimal proche de Python et Ruby. De traduire ce language dans un langage compilable (C++ ou le langage Go) et de permettre l'interaction entre les langages de script et le version compilée.
Les contraintes technologigues
- Python vers 3.5
- Python Abstract Syntax Trees https://docs.python.org/3/library/ast.html
- MessagePack
Plan de travail
- Découverte du sujet et des technologies
- Analyse du projet Project-2014-2015-ESP8266
- et notamment le contenu du répertoire parser du projet https://github.com/librallu/RICM4Projet
- Définir langage de script minimal à partir Python
- orienté objet
- type de variable simple
Divers
Notes
- L'indentation ne peut pas être traiter par un parser de type PEG (qui ne traite que context-free grammar,
les langages comme Python sont context-sensitive grammar ) - Voir http://stackoverflow.com/questions/4205442/peg-for-python-style-indentation
- On peurrendre explicite les blocs de code avec le module token avant de passer par le parser:
from tokenize import tokenize, untokenize, NAME, INDENT, DEDENT from io import BytesIO def indentation_explicitation(s): result = [] g = tokenize(BytesIO(s.encode('utf-8')).readline) # tokenize the string for toknum, tokval, _, _, _ in g: if toknum == INDENT: # replace NUMBER tokens result.extend([ (NAME, '<INDENT>') ]) elif toknum == DEDENT: result.extend([ (NAME, '<DEDENT>') ]) else: result.append((toknum, tokval)) return untokenize(result).decode('utf-8') s = """ def a(b): if b: print('yop') else: print('poy') b = b + 1 a(true) """ print(indentation_explicitation(s))
Ce qui donne:
(env3.4)auguste@akira:~/work/15-16/kael (master)> python token_ex.py def a (b ): <INDENT> if b : <INDENT> print ('yop') <DEDENT> else : <INDENT> print ('poy') <DEDENT> b =b +1 <DEDENT> a (true )
Liens utiles
- Liste de parser en python: https://wiki.python.org/moin/LanguageParsing
- A Lire Parsing expression grammar (PEG'): https://en.wikipedia.org/wiki/Parsing_expression_grammar
- Grako (A generator of PEG/Packrat parsers from EBNF grammars): https://pypi.python.org/pypi/grako/3.6.6
- Arpeggio http://igordejanovic.net/Arpeggio/
Installation d'Astmonkey
- Python 3.4
- Installation de pydot
- Récupérer une archive de https://github.com/nlhepler/pydot
- Décompresser (unzip) et installer par python setup.py install
- Installer Astmonkey par pip install astmonkey