Vorrei scrivere un generatore di lexer per convertire un sottoinsieme di base del linguaggio Matlab in C#, C++, ecc. Per aiutarlo a fare questo, vorrei trovare un documento contenente la grammatica formale per matlab. Avendo trascorso un po 'di tempo a indagare su questo, sembra che la matematica non ne fornisca una. Qualcuno sa dove posso trovare un documento del genere?Dove posso trovare una grammatica formale per Matlab?
risposta
Ottima occasione per scrivere la propria grammatica formale :)
Se si dovrebbe scegliere di scrivere la grammatica vostra auto, posso consigliare BNFC che può richiedere una grammatica formale BNF e costruire strutture dati e lexer/Parser per un un paio di lingue di destinazione (C/C++, C#, Java, Haskell ecc.). Questo ti farà risparmiare un sacco di tempo e ti consentirà di concentrarti sulla formulazione della grammatica, e quindi di implementare il convertitore nella tua lingua preferita.
Se non altro, il collegamento a BNFC contiene alcuni aiuti e indicazioni su come formulare una grammatica BNF. Buona fortuna!
Grazie per il consiglio, darò un'occhiata. Stavo pensando di usare fslex e fsyacc. –
Questa grammatica non è completa ma yacc-keable for matlab fornita per un corso di compilatore nell'anno 2000. Da questo, è possibile creare facilmente BNF ed EBNF.
primary_expression
: IDENTIFIER
| CONSTANT
| STRING_LITERAL
| '(' expression ')'
| '[' ']'
| '[' array_list ']'
;
postfix_expression
: primary_expression
| array_expression
| postfix_expression TRANSPOSE
| postfix_expression NCTRANSPOSE
;
index_expression
: ':'
| expression
;
index_expression_list
: index_expression
| index_expression_list ',' index_expression
;
array_expression
: IDENTIFIER '(' index_expression_list ')'
;
unary_expression
: postfix_expression
| unary_operator postfix_expression
;
unary_operator
: '+'
| '-'
| '~'
;
multiplicative_expression
: unary_expression
| multiplicative_expression '*' unary_expression
| multiplicative_expression '/' unary_expression
| multiplicative_expression '\\' unary_expression
| multiplicative_expression '^' unary_expression
| multiplicative_expression ARRAYMUL unary_expression
| multiplicative_expression ARRAYDIV unary_expression
| multiplicative_expression ARRAYRDIV unary_expression
| multiplicative_expression ARRAYPOW unary_expression
;
additive_expression
: multiplicative_expression
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
relational_expression
: additive_expression
| relational_expression '<' additive_expression
| relational_expression '>' additive_expression
| relational_expression LE_OP additive_expression
| relational_expression GE_OP additive_expression
;
equality_expression
: relational_expression
| equality_expression EQ_OP relational_expression
| equality_expression NE_OP relational_expression
;
and_expression
: equality_expression
| and_expression '&' equality_expression
;
or_expression
: and_expression
| or_expression '|' and_expression
;
expression
: or_expression
| expression ':' or_expression
;
assignment_expression
: postfix_expression '=' expression
eostmt
: ','
| ';'
| CR
;
statement
: global_statement
| clear_statement
| assignment_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
;
statement_list
: statement
| statement_list statement
;
identifier_list
: IDENTIFIER
| identifier_list IDENTIFIER
;
global_statement
: GLOBAL identifier_list eostmt
;
clear_statement
: CLEAR identifier_list eostmt
;
expression_statement
: eostmt
| expression eostmt
;
assignment_statement
: assignment_expression eostmt
;
array_element
: expression
| expression_statement
;
array_list
: array_element
| array_list array_element
;
selection_statement
: IF expression statement_list END eostmt
| IF expression statement_list ELSE statement_list END eostmt
| IF expression statement_list elseif_clause END eostmt
| IF expression statement_list elseif_clause
ELSE statement_list END eostmt
;
elseif_clause
: ELSEIF expression statement_list
| elseif_clause ELSEIF expression statement_list
;
iteration_statement
: WHILE expression statement_list END eostmt
| FOR IDENTIFIER '=' expression statement_list END eostmt
| FOR '(' IDENTIFIER '=' expression ')' statement_list END eostmt
;
jump_statement
: BREAK eostmt
| RETURN eostmt
;
translation_unit
: statement_list
| FUNCTION function_declare eostmt statement_list
;
func_ident_list
: IDENTIFIER
| func_ident_list ',' IDENTIFIER
;
func_return_list
: IDENTIFIER
| '[' func_ident_list ']'
;
function_declare_lhs
: IDENTIFIER
| IDENTIFIER '(' ')'
| IDENTIFIER '(' func_ident_list ')'
;
function_declare
: function_declare_lhs
| func_return_list '=' function_declare_lhs
;
Dave Wingate fornisce alcune risorse di Antler che sembrano un ottimo punto di partenza. Come indicato nel suo file README, non include l'operatore di trasposizione e alcune altre analisi complicate. Vedere la mparser collegamento qui:
http://web.mit.edu/~wingated/www/resources.html
alcuni dei bit difficili delle versioni precedenti di Matlab (1999) sono anche descritti in un documento da un gruppo di Northwestern. Include descrizioni di tipo EBNF. Delinea anche alcuni bit sgradevoli in alcune note.
http://www.ece.northwestern.edu/cpdc/pjoisha/MAGICA/CPDC-TR-9909-017.pdf
Ho raccolto un paio di altre fonti meno rilevanti, ma editor di bot di StackOverflow mi dice che non ho abbastanza punti reputazione di inviare più di due link.
Si può iniziare adattando il convertitore MATLAB -> Python smop
che è esso stesso scritto in Python. Utilizza PLY (Python lex
- yacc
). I file che potresti essere interessato a iniziare sono lexer.py e parse.py.
Vedere anche this answer per un elenco di convertitori da MATLAB a Python.
Sospetto fortemente che Mathworks non definisca una grammatica formale per Matlab. Guarderò le risposte a questo. –
Ottava analizza la grammatica di Matlab. Potrebbe valere la pena di controllare quello che hanno già fatto. –
Il [file lex] (http://hg.savannah.gnu.org/hgweb/octave/file/c1f9b54350f9/src/lex.ll) nell'origine Octave è utile. Ho anche trovato un [parser antl] (http://www.antlr.org/pipermail/antlr-interest/2011-Settembre/042551.html) che converte matlab in C e Java. –