2012-03-06 7 views
21

저는 Matlab 언어의 기본 하위 집합을 C#, C++ 등으로 변환하는 렉서 생성기를 작성하고 싶습니다.이를 돕기 위해 matlab에 대한 공식 문법이 포함 된 문서를 찾고 싶습니다. 이 문제를 조사하는 데 약간의 시간을 투자 했으므로 mathworks에서 제공하지 않습니다. 누구나 그러한 문서를 어디에서 찾을 수 있는지 알고 있습니까?Matlab의 공식 문법은 어디에서 찾을 수 있습니까?

자신의 공식 문법 :

당신은 문법에게 자기를 작성 선택해야하는 경우에, 나는 공식적인 BNF 문법을하고 데이터 구조와 렉서/파서를 구성 할 수있는 BNFC을 추천 할 수 있습니다를 작성하는

+5

Mathworks는 Matlab의 공식 문법을 정의하지 않는다고 강력하게 의심합니다. 나는 이것에 대한 답변을 볼 것이다. –

+3

Octave는 Matlab의 문법을 구문 분석합니다. 그들이 이미 한 것을 보람있는 것일 수도 있습니다. –

+2

옥타브 소스의 [lex file] (http://hg.savannah.gnu.org/hgweb/octave/file/c1f9b54350f9/src/lex.ll)이 유용합니다. 나는 또한 matlab을 C와 Java로 변환하는 [antl parser] (http://www.antlr.org/pipermail/antlr-interest/2011-September/042551.html)를 발견했다. –

답변

5

좋은 기회 몇 가지 대상 언어 (C/C++, C#, Java, Haskell 등). 이렇게하면 많은 시간을 절약 할 수 있고 문법을 공식화하는 데 주력 할 수 있습니다. 그런 다음 원하는 언어로 변환기를 구현할 수 있습니다.

BNFC에 대한 링크에는 BNF 문법을 공식화하는 방법에 대한 도움말과 지침이 포함되어 있습니다. 행운을 빌어 요!

+0

조언 해 주셔서 감사합니다. 나는 fslex와 fsyacc를 사용하려고 생각하고 있었다. –

6

이것은 완전한 문법이 아니지만 2000 년 컴파일러 과정에 yacc-keable for matlab이 제공됩니다. 이로부터 BNF와 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)는 시작하기에 적합한 곳으로 보이는 앤틀러 리소스를 제공합니다. 그의 README 파일에서 언급했듯이, 그는 조바꿈 연산자와 몇 가지 까다로운 구문을 포함하지 않습니다. matlab에 (1999) 이전 버전의 까다로운 비트의 일부는 노스 웨스턴에서 그룹에 의해 문서에 설명되어 있습니다
http://web.mit.edu/~wingated/www/resources.html

: 여기 mparser 링크를 참조하십시오. 여기에는 EBNF와 유사한 설명이 포함됩니다. 또한 각주의 일부 불쾌한 점을 설명합니다.
http://www.ece.northwestern.edu/cpdc/pjoisha/MAGICA/CPDC-TR-9909-017.pdf

본인은 관련성이 적은 소스의 몇 가지를 수집했지만 유래의 에디터 봇은 내가 두 개 이상의 링크를 게시 할 수있는 충분한 명성 포인트가없는 나에게 말한다.

0

그 자체가 파이썬으로 작성된 MATLAB -> Python 변환기 smop을 적용하여 시작할 수 있습니다. PLY (Python lex-yacc)을 사용합니다. 시작하고자하는 파일은 lexer.pyparse.py입니다.

this answer 또한 MATLAB에서 Python으로의 변환기 목록을 참조하십시오.