Я пытаюсь написать простой комбинатор синтаксического анализатора для синтаксического анализа кода 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);
Мой репо