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?
Respuesta
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!
Gracias por el consejo, voy a echar un vistazo. Estaba pensando en usar fslex y fsyacc. –
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
;
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.
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.
- 1. ¿Dónde puedo encontrar una gramática formal para el lenguaje de programación Perl?
- 2. ¿Dónde puedo encontrar el archivo oficial de Gramática para el lenguaje de programación Java 7?
- 3. ¿Dónde puedo encontrar la gramática BNF o YACC estándar para el lenguaje C++?
- 4. ¿Dónde puedo encontrar "j_security_check"?
- 5. ¿Dónde puedo encontrar Microsoft.Build.Utilities.v3.5
- 6. ¿Dónde puedo encontrar WSDL.exe?
- 7. ¿Dónde puedo encontrar TableDiff.exe?
- 8. ¿Dónde puedo encontrar GACUtil?
- 9. ¿Dónde puedo encontrar la aplicación para IVCWizCtlUI
- 10. ¿Dónde puedo encontrar documentación para BlueZ?
- 11. ¿Dónde puedo encontrar una implementación de javax.validation. *?
- 12. ¿Dónde puedo encontrar fuentes .NET para descargar?
- 13. ¿Dónde puedo encontrar complementos para Resharper?
- 14. ¿Dónde puedo encontrar documentación para NHibernate ISession.Persist()?
- 15. ¿Dónde puedo encontrar bcp para impulsar?
- 16. ¿Dónde puedo encontrar documentación para RDLC xml?
- 17. ¿Dónde puedo encontrar una lista de horarios?
- 18. ¿Dónde puedo encontrar una biblioteca de ECommerce?
- 19. ¿Dónde puedo encontrar una API para la Premier League inglesa?
- 20. ¿Dónde puedo encontrar una buena guía para escribir C Collections?
- 21. ¿Dónde puedo encontrar una biblioteca ICQ para C#?
- 22. ¿Dónde puedo encontrar una clase C# para "Shamir's Secret Sharing"?
- 23. ¿Dónde puedo encontrar usuarios beta?
- 24. ¿Existe una gramática formal del lenguaje js (idealmente BNF) (o solo un subconjunto de texto mecanografiado)?
- 25. ¿Dónde puedo encontrar un buen tutorial para principiantes para ColdFusion?
- 26. ¿Cómo puedo encontrar máximos locales en una imagen en MATLAB?
- 27. ¿Dónde puedo encontrar la documentación de configuración de xml arquillian?
- 28. ¿Dónde puedo obtener material para aprender EBNF?
- 29. SynEdit: ¿dónde encontrar una comunidad?
- 30. ¿Dónde puedo encontrar el paquete javax.media.opengl?
Sospecho que Mathworks no define una gramática formal para Matlab. Buscaré respuestas a esta. –
Octave analiza la gramática de Matlab. Puede valer la pena verificar lo que ya hicieron. –
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. –