Я пытаюсь написать парсер для формата Allen Bradly SLC Language/File. Я успешно получил его для анализа ссылки на регистр. т.е. N5:4/3. Однако, когда я пытаюсь перейти на следующий уровень, анализируя список ссылок на регистры, разделенных пробелом, он выдает следующую ошибку
Вход:
N30:3/8 B20:3/3
Ошибка:
(L1, C9) Синтаксическая ошибка, ожидаемая: :
Вот мой код, его можно собрать и загрузить в Irony Grammar Explorer.
using System;
using Irony.Parsing;
namespace Irony.Samples.SLC
{
[Language("SLC", "1.0", "RS Logix 500 SLC")]
public class SLCGrammar : Grammar
{
public SLCGrammar()
{
//Terminals
var SLCFilePrefix = new FixedLengthLiteral("Type", 1, TypeCode.String);
var SLCRegisterWord = new NumberLiteral("Word");
var SLCRegisterBit = new NumberLiteral("Bit");
var SLCRegisterFileNumber = new NumberLiteral("FileNumber");
//Nonterminals
var SLCInstructionRegisterList = new NonTerminal("InstructionRegisterList");
var SLCRegisterReference = new NonTerminal("RegisterReference");
var SLCRegisterReferenceWordOrBit = new NonTerminal("RegisterReferenceWordOrBit");
var SLCRegisterReferenceWordWithBit = new NonTerminal("RegisterReferenceWordWithBit");
//Rules
SLCRegisterReferenceWordWithBit.Rule = SLCRegisterWord + "/" + SLCRegisterBit;
SLCRegisterReferenceWordOrBit.Rule = SLCRegisterReferenceWordWithBit | SLCRegisterWord;
SLCRegisterReference.Rule = SLCFilePrefix + SLCRegisterFileNumber + ":" + SLCRegisterReferenceWordOrBit;
SLCInstructionRegisterList.Rule = MakePlusRule(SLCInstructionRegisterList, SLCRegisterReference);
//Set grammar root
this.Root = SLCInstructionRegisterList;
//MarkPunctuation(" ");
}//constructor
}//class
}//namespace
Если я изменю следующую строку
SLCInstructionRegisterList.Rule = MakePlusRule(SLCInstructionRegisterList, SLCRegisterReference);
To
SLCInstructionRegisterList.Rule = MakePlusRule(SLCInstructionRegisterList, ToTerm(" "), SLCRegisterReference);
я получил
Ошибка: (L1,C9) Синтаксическая ошибка, ожидаемая:
Я предполагаю, что это означает, что ожидается пробел
Любая помощь будет оценена по достоинству. Я только начал изучать иронию, и нет тонны документации.
Примечание. Позже я хотел бы иметь возможность анализировать регистр, который принимает форму T8:5/DN
, означающую, что после косой черты следует строка, а не число. который завершается пробелом