相关疑难解决方法(0)

手编码解析器

对于你所有的编译器大师,我想编写一个递归下降解析器,我想用代码来做.没有从其他语法生成词法分析器和解析器并且不告诉我阅读龙书,我最终会到达那里.

我想进入关于为一个合理的简单语言实现词法分析器和解析器的细节,比如说CSS.我想这样做.

这可能最终会成为一系列问题,但现在我开始使用词法分析器了.可以在此处找到CSS的标记规则.

我发现自己编写了这样的代码(希望你可以从这个片段推断出其余部分):

public CssToken ReadNext()
{
    int val;
    while ((val = _reader.Read()) != -1)
    {
        var c = (char)val;
        switch (_stack.Top)
        {
            case ParserState.Init:
                if (c == ' ')
                {
                    continue; // ignore
                }
                else if (c == '.')
                {
                    _stack.Transition(ParserState.SubIdent, ParserState.Init);
                }
                break;

            case ParserState.SubIdent:
                if (c == '-')
                {
                    _token.Append(c);
                }
                _stack.Transition(ParserState.SubNMBegin);
                break;
Run Code Online (Sandbox Code Playgroud)

这个叫什么?我离合理的东西有多远了?我试图在效率和易于使用方面平衡一些公平的东西,使用堆栈来实现某种状态机工作得很好,但我不确定如何继续这样做.

我所拥有的是一个输入流,我可以从中一次读取1个字符.我现在不做任何看法,我只是阅读角色,然后根据当前状态尝试做一些事情.

我真的很想进入编写可重用代码片段的思维模式.此Transition方法目前是这样做的,它将弹出堆栈的当前状态,然后以相反的顺序推送参数.这样,当我写Transition(ParserState.SubIdent, ParserState.Init)它时,它将"调用"一个子程序SubIdent,当完成后,它将返回Init状态.

解析器将以大致相同的方式实现,目前,在这样的单个大方法中,所有内容都允许我在找到令牌时轻松返回令牌,但它也迫使我将所有内容保存在一个单一的大方法中.有没有一种很好的方法将这些标记化规则拆分成单独的方法?

c# compiler-construction parsing lexer

26
推荐指数
3
解决办法
7417
查看次数

标签 统计

c# ×1

compiler-construction ×1

lexer ×1

parsing ×1