2012-03-06 17 views
21

Me gustaría escribir un generador de lexer para convertir un subconjunto básico del lenguaje Matlab a C#, C++, etc. Para ayudarme a hacer esto, me gustaría encontrar un documento que contenga la gramática formal para matlab. Habiendo pasado un poco de tiempo investigando esto, parece que mathworks no proporciona uno. ¿Alguien sabe dónde podría encontrar ese documento?¿Dónde puedo encontrar una gramática formal para Matlab?

+5

Sospecho que Mathworks no define una gramática formal para Matlab. Buscaré respuestas a esta. –

+3

Octave analiza la gramática de Matlab. Puede valer la pena verificar lo que ya hicieron. –

+2

El [archivo lex] (http://hg.savannah.gnu.org/hgweb/octave/file/c1f9b54350f9/src/lex.ll) en la fuente de Octave es útil. También encontré un [analizador antl] (http://www.antlr.org/pipermail/antlr-interest/2011-September/042551.html) que convierte matlab en C y Java. –

Respuesta

5

excelente oportunidad de escribir su propia gramática formal :)

Si tuviera que elegir a escribir la gramática de su auto, puedo recomendar BNFC que puede tomar una gramática formal BNF y la construcción de estructuras de datos y/lexers analizadores para una par de idiomas de destino (C/C++, C#, Java, Haskell, etc.). Esto le ahorrará mucho tiempo y le permitirá enfocarse en formular la gramática, y luego implementar la conversión en su idioma de preferencia.

Si nada más, el enlace a BNFC contiene alguna ayuda y consejos sobre cómo formular una gramática BNF. ¡La mejor de las suertes!

+0

Gracias por el consejo, voy a echar un vistazo. Estaba pensando en usar fslex y fsyacc. –

6

Esto no es una gramática completa, pero yacc-keable for matlab proporcionado para un curso de compilación en el año 2000. A partir de esto, puede crear fácilmente BNF y 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 
     ; 
4

Dave Wingate proporciona algunos recursos de Antler que se ven como un excelente lugar para comenzar. Como se señala en su archivo README, no incluye el operador de transposición y algunos otros análisis complicados. Ver el mparser enlace aquí:
http://web.mit.edu/~wingated/www/resources.html

Algunos de los bits difíciles de versiones anteriores de Matlab (1999) también se describen en un documento por un grupo de Northwestern. Incluye descripciones similares a EBNF. También describe algunas partes desagradables en algunas notas a pie de página.
http://www.ece.northwestern.edu/cpdc/pjoisha/MAGICA/CPDC-TR-9909-017.pdf

He recogido un par de otras fuentes menos relevantes, pero bot editor de StackOverflow me dice que no tengo suficiente punto de reputación para publicar más de dos enlaces.

0

Puede comenzar por adaptar el convertidor de MATLAB -> Python smop que está escrito en Python. Utiliza PLY (Python lex - yacc). Los archivos que probablemente le interesaría comenzar son lexer.py y parse.py.

Consulte también this answer para obtener una lista de los convertidores de MATLAB a Python.

Cuestiones relacionadas