Я пытаюсь написать парсер для Allen Bradly SL C Язык / Формат файла. Я успешно получил его для анализа ссылки на регистр. IE N5: 4/3. Однако, когда я пытаюсь перейти на следующий уровень, анализируя список ссылок на регистры, разделенных пробелами, он выдает следующую ошибку
Ввод:
N30: 3 / 8 B20: 3/3
Ошибка:
(L1, C9) Синтаксическая ошибка, ожидаемая::
Вот мой код, это может быть построено и DLL загружены в иронии грамматики 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);
На
SLCInstructionRegisterList.Rule = MakePlusRule(SLCInstructionRegisterList, ToTerm(" "), SLCRegisterReference);
I get
Ошибка: (L1, C9) Синтаксическая ошибка, ожидается:
Что, как я предполагаю, означает, что ожидается пробел
Любая помощь будет быть оцененным Я только начал изучать иронию, и там нет тонны документации.
Примечание: Позже я хотел бы иметь возможность проанализировать регистр, который принимает эту форму T8:5/DN
, что означает, что после forward-sla sh вместо числа стоит строка. что заканчивается это пробел