CEX2CPP
えーと、C式をC言語にトランスレートするプログラムを作ってみました。
だいぶ、手抜きなんですが、、、。
javascriptへのトランスレータのコピペ&一部手直しになっています。
import stdio.h a:int(b:int, c:int) { return b+c; } main:int() { printf("hello world %d\n", a(1,2)); b:int = 10; if(b == 10) { printf("if 10\n"); } else { printf("not 10\n"); } switch(b) { case(1){ printf("1\n"); break; } case(10){ printf("10\n"); } default{printf("default\n");} } i:int; for(i=0;i<3;i++) { printf("for %d\n", i); } i = 0; while(i<3) { printf("while %d\n", i); i++; } i = 0; do { printf("do %d\n", i); i++; } while(i < 3); return 0; }
このプログラムを、以下のc言語に変換します。
#include <stdio.h> int a ( int b , int c) { return b + c ;} int main () {printf ( "hello world %d\n" , a ( 1 , 2)) ; int b = 10 ; if ( b == 10) {printf ("if 10\n") ;} else {printf ("not 10\n") ;} switch (b) {case 1 : {printf ("1\n") ; break ;} case 10 : {printf ("10\n") ;} default: {printf ("default\n") ;}} int i ; for ( i = 0 ; i < 3 ; ++ i) {printf ( "for %d\n" , i) ;} i = 0 ; while ( i < 3) {printf ( "while %d\n" , i) ; ++ i ;} i = 0 ; do {printf ( "do %d\n" , i) ; ++ i ;} while ( i < 3) ; return 0 ;}
バグだらけだと思うのですが、結構、あっという間に作れました。
マッチングとかつかわないで変換してるので、マッチングつかったりするともっと
楽に出来るかと思います。
// [disable,[import,[.,stdio,h]],[:,a,[int,[paren,[,,[:,b,int],[:,c,int]]],[bloc k,[return,[+,b,c]],;]]],[:,main,[int,[paren],[block,[printf,[paren,[,,"hello wor ld %d\n",[a,[paren,[,,1,2]]]]]],;,[=,[:,b,int],10],;,[else,[if,[paren,[==,b,10]] ,[block,[printf,[paren,"if 10\n"]],;]],[[block,[printf,[paren,"not 10\n"]],;]]], [switch,[paren,b],[block,[case,[paren,1],[block,[printf,[paren,"1\n"]],;,break,; ]],[case,[paren,10],[block,[printf,[paren,"10\n"]],;]],[default,[block,[printf,[ paren,"default\n"]],;]]]],[:,i,int],;,[for,[paren,[=,i,0],;,[<,i,3],;,[++,i]],[b lock,[printf,[paren,[,,"for %d\n",i]]],;]],[=,i,0],;,[while,[paren,[<,i,3]],[blo ck,[printf,[paren,[,,"while %d\n",i]]],;,[++,i],;]],[=,i,0],;,[do,[[block,[print f,[paren,[,,"do %d\n",i]]],;,[++,i],;]]],[while,[paren,[<,i,3]]],;,[return,0],;] ]]]
内部的には、ちゃんと、一度こんなツリーに構文解析されてます。
ダウンロードはこちらから。
http://sakurai.s59.xrea.com/cxp/cex2cpp.js
600行くらいです。
実行方法は、
cscript //nologo cex2cpp.js< test.c2>test.cpp
のような感じです。
話を聞いてくれたid:moceanさんに感謝です。
moceanさんがいなかったら、完成出来なかったと思うよ。