26

MATLAB 言語の基本的なサブセットを C# や C++ などに変換するレクサー ジェネレーターを作成したいと考えています。これを行うために、MATLAB の正式な文法を含むドキュメントを見つけたいと考えています。これについて少し時間をかけて調査したところ、Mathworks はそれを提供していないようです。

そのようなドキュメントをどこで見つけることができるか知っている人はいますか?

4

5 に答える 5

10

これは完全な文法ではありませんが、2000 年のコンパイラ コースで提供されたmatlab の yacc-keable です。これにより、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
        ;
于 2012-09-16T02:51:51.633 に答える
5

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

グラマーを自分で作成することを選択する必要がある場合は、正式な BNF 文法を使用して、いくつかのターゲット言語 (C/C++、C#、Java、Haskell など) 用のデータ構造とレクサー/パーサーを構築できるBNFCをお勧めします。これにより、多くの時間を節約でき、文法の定式化に集中でき、好みの言語でコンバーターを実装することができます。

他に何もないとしても、BNFC へのリンクには、BNF 文法の作成方法に関するヘルプとポインタが含まれています。頑張ってください!

于 2012-03-06T12:07:18.693 に答える
5

Dave Wingate が Antler のリソースをいくつか提供しています。彼の README ファイルに記載されているように、彼は転置演算子やその他のいくつかのトリッキーな解析を含めていません。ここのmparserリンクを参照してください:
http://web.mit.edu/~wingated/www/resources.html

以前のバージョンの Matlab (1999) のトリッキーな部分のいくつかは、Northwestern のグループによるドキュメントでも説明されています。これには、EBNF のような記述が含まれています。また、いくつかの脚注でいくつかの厄介な点について概説しています。
http://www.ece.northwestern.edu/cpdc/pjoisha/MAGICA/CPDC-TR-9909-017.pdf

関連性の低い他のソースをいくつか収集しましたが、stackoverflow のエディター ボットは、2 つ以上のリンクを投稿するのに十分な評判ポイントがないことを示しています。

于 2014-07-06T20:54:39.110 に答える