2012-03-06 5 views
21

私は、Matlab言語の基本サブセットをC#、C++などに変換するためのレクサージェネレータを作成したいと思います。これを行うために、私はmatlabの正式な文法を含むドキュメントを探したいと思います。これを調査するのに少し時間を費やしていたので、数学はそれを提供していないようです。 誰もそのような文書がどこにあるのか知っていますか?Matlabの正式な文法はどこで見つけることができますか?

+5

私はMathworksがMatlabの正式な文法を定義していないと強く疑っています。私はこれに答えて見守ります。 –

+3

OctaveはMatlabの文法を解析します。彼らが何をしたのかを確認する価値があるかもしれません。 –

+2

Octaveソースの[lex file](http://hg.savannah.gnu.org/hgweb/octave/file/c1f9b54350f9/src/lex.ll)が役立ちます。私はまた、[antlパーサー](http://www.antlr.org/pipermail/antlr-interest/2011-September/042551.html)を見て、matlabをCとJavaに変換しました。 –

答えて

5

独自の正式な文法を書くための絶好の機会:)

にあなたがあなたの自己文法を書くことを選択しなければならない場合、私は正式なBNF文法を取るとデータ構造を構築することができBNFCをお勧めすることができますし、ためレクサー/パーサは、いくつかのターゲット言語(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は素晴らしいスタート地点のようなAntlerのリソースを提供しています。 彼の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

私は他のあまり関係のソースのカップルを集めてきましたが、stackoverflowのエディタのボットは、私が二つ以上のリンクを投稿するのに十分な評判ポイントを持っていないと言われます。

0

まず、Pythonで書かれたMATLAB - > Pythonコンバータsmopを採用することができます。 PLY(Python lex - yacc)を使用しています。あなたが最初に興味のあるファイルはlexer.pyparse.pyです。

this answerも参照してください。これは、MATLABからPythonへのコンバータの一覧です。

関連する問題