Парсер MIPS, использующий C# Pidgin, не может разобрать последовательность вещей - PullRequest
3 голосов
/ 22 марта 2020

Я пытаюсь написать простой комбинатор синтаксического анализатора для синтаксического анализа кода MIPS с использованием библиотеки Pidgin, но мой синтаксический анализатор SeparatedAndOptionallyTerminated всегда находит в синтаксическом анализаторе одну вещь, и не выдается никакой ошибки. Я не уверен, что происходит.

Я ценю любую помощь или подсказку.

var skipCommaP = Char(',').IgnoreResult();

var registerP = Char('$')
    .Then(Enums.GetValues<Register>().Select(x => x.Name())
        .Select(x => String(new string(x.Skip(1).ToArray())))
        .Aggregate((a, b) => a.Or(b))
        .Map(v => $"${v}".ToRegister()));

var loadImmediateP = Map(
    (a, b, c) => (Instruction) new LoadImmediate(b, c),
    String(LoadImmediate.Name).Between(SkipWhitespaces),
    registerP.Before(skipCommaP.Optional()).Between(SkipWhitespaces),
    Num.Between(SkipWhitespaces)
);

var moveP = Map(
    (a, b, c) => (Instruction) new Move(b, c),
    String(Move.Name).Between(SkipWhitespaces),
    registerP.Before(skipCommaP.Optional()).Between(SkipWhitespaces),
    registerP.Between(SkipWhitespaces)
);

var instructionsP = loadImmediateP.Or(moveP);

ProgramP = instructionsP.SeparatedAndOptionallyTerminated(EndOfLine);

Затем, используя ее:

const string code = "move $t0, $t0 \n" + 
                    "li $t0 555";

var result = new MipsParser().ProgramP.Parse(code);

// result.Value has single thing in it always.
Console.WriteLine(result);

Мой репо

...