読者です 読者をやめる 読者になる 読者になる

【Programming】標準C++正規表現の勉強としての派生言語

言語を失った音ゲーマーの会話を元にこんなの作ってみました。
C++11から使える正規表現を勉強した成果です(てきとう)
この前のbrainf*ckと適当に組み合わせれば動きます。
文字入れ替えただけなので特に言語の部分は作っていません

outputがpublicだったり、変換する文字列の種類によっては問題が起きそうですが、以下の仕様下では問題ない(筈)

名前 意味
ラ。 ポインタをインクリメント
ラ? ポインタをデクリメント
マ。 ポインタが指す値をインクリメント
マ? ポインタが指す値をデクリメント
ポインタが指す値を出力
りょ 入力を読み込み、ポインタが指す所に代入
ポインタが指す値が0なら対応する指まで移動
ポインタが指す値が0でないなら対応する寺まで移動

Input

マ。マ。マ。マ。マ。マ。マ。マ。マ。
寺
ラ。マ。マ。マ。マ。マ。マ。マ。マ。
ラ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
ラ。マ。マ。マ。マ。マ。
ラ?ラ?ラ?マ?
指
ラ。ボ
ラ。マ。マ。ボ
マ。マ。マ。マ。マ。マ。マ。ボボ
マ。マ。マ。ボ
ラ。マ?ボ
マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?ボ
ラ?マ。マ。マ。マ。マ。マ。マ。マ。ボ
マ?マ?マ?マ?マ?マ?マ?マ?ボ
マ。マ。マ。ボ
マ?マ?マ?マ?マ?マ?ボ
マ?マ?マ?マ?マ?マ?マ?マ?ボ
ラ。マ。ボ

Output

Hello,world!

以下ソース。
問題点ありまくりなのは素人目にもわかりますが、別にregex使ってみようってコンセプトでやってるのでその辺が出来てるならいいかなって(てきとう)

#ifndef LEX_ANALYZE
#define LEX_ANALYZE

#include <string>
#include <vector>
#include <map>

using namespace std;
class LexicalAnalyser{
public:
    LexicalAnalyser(wstring _input);
    string getcode(int num);
    wstring output;
private:
    void analyse();
    wstring input;
    vector<string> code;
    map<const wchar_t*,const wchar_t*> replaceMap;
};

#endif

 

#include "./lexAnalyse.h"
#include <regex>
#include <iostream>

using namespace std;

LexicalAnalyser::LexicalAnalyser(wstring _input){
    input = _input;

    replaceMap[L"ラ。"] = L">";
    replaceMap[L"ラ?"] = L"<";
    replaceMap[L"マ。"] = L"+";
    replaceMap[L"マ?"] = L"-";
    replaceMap[L"ボ"] = L".";
    replaceMap[L"りょ"] = L",";
    replaceMap[L"寺"] = L"[";
    replaceMap[L"指"] = L"]";

    analyse();
}

string LexicalAnalyser::getcode(int num){
    return code[num];
}

void LexicalAnalyser::analyse(){
    output = input;
    for(map<const wchar_t*,const wchar_t*>::const_iterator it = replaceMap.begin();it != replaceMap.end();it++){
        wregex re(it->first);
        const wchar_t* rep = output.c_str();
        output = regex_replace(rep,re,it->second);
    }
}

 


元ネタ・参考togetter.com

codezine.jp