parsing - 是否有关于Erlang解析变换的完整教程?





(4)


使用https://github.com/uwiger/parse_trans可以轻松完成这些操作

有许多片段详细说明了Erlang中解析变换过程的各个部分,但是我没有找到从动机到执行的完整覆盖。 是否有一个很好的教程,我在某处失踪,如果有的话,它在哪里可以找到?










我写了一些可以读取字符串和字符文字的代码。 与普通流读取一样,如果它获得无效数据,则设置流的badbit。 这适用于所有类型的流,包括宽流。 将此位粘贴在新标题中:

#include <iostream>
#include <string>
#include <array>
#include <cstring>

template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e(&sliteral)[N]) {
        std::array<e, N-1> buffer; //get buffer
        in >> buffer[0]; //skips whitespace
        if (N>2)
                in.read(&buffer[1], N-2); //read the rest
        if (strncmp(&buffer[0], sliteral, N-1)) //if it failed
                in.setstate(in.rdstate() | std::ios::failbit); //set the state
        return in;
}
template<class e, class t>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e& cliteral) {
        e buffer;  //get buffer
        in >> buffer; //read data
        if (buffer != cliteral) //if it failed
                in.setstate(in.rdstate() | std::ios::failbit); //set the state
        return in;
}
//redirect mutable char arrays to their normal function
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, e(&carray)[N]) {
        return std::operator>>(in, carray);
}

它将使输入字符变得非常容易:

std::istringstream input;
double val1, val2;
if (input >>'('>>val1>>','>>val2>>')') //less chars than scanf I think
{
    // got them!
}

概念证明 。 现在你可以使用字符串和字符文字,如果输入不是完全匹配,它就像任何其他未能正确输入的类型一样。 请注意,这仅匹配不是第一个字符的字符串文字中的空格。 它只有四个功能,所有功能都是脑死亡的简单功能。

编辑

解析流是一个坏主意。 使用正则表达式。





parsing erlang