Oui, je sais, la version 0.0 de R++ n'est pas censée exister... Elle vient pourtant d'être ajoutée. Elle n'a aucun intérêt, c'est juste pour amorcer la grammaire. C'est la même que la 0.1 sans les types récursifs, sans les "<-" ni les "[" et avec très peu d'opérations possibles.
1 Définition des token
1.1 Expressions régulières
1 2 3 4 5 6 7
| letterMaj [A-Z]
letterMin [a-z]
letter letterMaj | letterMin
digit [0_9]
digit_not_nul [1_9]
other é | è | ç | à | ê | ù // on complètera
ascii letter |digit | other |
1.2 Constantes typées
1 2 3 4 5 6 7 8 9 10 11 12 13
| LIT_LOGICAL TRUE | FALSE
LIT_INTEGER ("-"|"+")? (digitNotNul digit* | "0")
LIT_NUMERIC LIT_INTEGER "." digit+ ("E" LIT_INTEGER)?
LIT_CHARACTER QUOTE1 ascii* QUOTE1 | QUOTE2 ascii* QUOTE2 | QUOTE3 ascii* QUOTE3
LIT_VECTOR "c"
LIT_SUITE "suite"
LIT_LIST "list"
LIT_TYPE_COMPOSE LIT_VECTOR | LIT_SUITE | LIT_LIST
LOGICAL TRUE | FALSE
INTEGER ("-"|"+")? (digitNotNul digit* | "0")
NUMERIC INTEGER "." digit+ ("E" INTEGER)?
CHARACTER QUOTE1 ascii* QUOTE1 | QUOTE2 ascii* QUOTE2 |
1.3 Les mots clefs du langage
1 2 3 4
| SET set
GET get
TYPE type
IS_EQUAL isEqual |
Dans le formalisme du langage, les affectations seront possibles via 'set' ou via '<-'. Les acces se feront via 'get' ou en tapant simplement le nom de la variable. Ainsi, les lignes 1 et 2 sont rigoureusement identiques, idem pour les lignes 4 et 5 :
1 2 3 4 5
| aze.set(3)
aze <- 3
aze.get()
aze |
Question : spécifie-t-on dans la grammaire que les codes des lignes 2 et 5 sont acceptables, ou fait-on tourner un pré parseur qui ré écrit systématiquement les lignes 2 en lignes 1 et les lignes 5 en lignes 4 ?
1.4 Operateurs
1 2 3 4
| PLUS +
MULT *
AND AND
OR OR |
1.5 Identifiants
IDENTIFIANT letter (letter|digit)*
1.6 Ponctuation
1 2 3 4 5 6
| COMMA ,
OPEN_PAR (
CLOSE_PAR )
DOT .
QUOTE1 '
QUOTE2 " |
2 Règles syntaxiques
1 2 3 4 5 6 7
| prog -> stmt*
stmt -> <IDENTIFIANT> <DOT> method <OPEN_PAR> args? <CLOSE_PAR>
method -> <SET> | <GET> | <TYPE> | <IS_EQUAL>
args -> expression (<COMMA> expression)*
expression -> expression2 (operateur expression2)*
expression2 -> <OPEN_PAR> expression <CLOSE_PAR> | value
value -> <LOGICAL> | <INTEGER> | <NUMERIC> | <CHARACTER> | <IDENTIFIANT> |
Partager