Ирония Разбор списка, разделенного пробелом

Я пытаюсь написать парсер для формата 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, означающую, что после косой черты следует строка, а не число. который завершается пробелом


person TheColonel26    schedule 12.02.2020    source источник


Ответы (1)


Использование ValidateTokenMethod и отклонение всего, что не было от A до Z, решило эту проблему.

Проблема заключалась в том, что / интерпретировалось как начало новой ссылки на регистр.

var SLCFilePrefix = new FixedLengthLiteral("Type", 1, TypeCode.String);
SLCFilePrefix.ValidateToken += (e, s) =>
{
    if (char.IsUpper(s.Token.ValueString[0]) == false)
    {
        s.RejectToken();
    }    
};

Спасибо, Роман Иванцов (Original Creator) за ответ и помощь в этом по электронной почте.

person TheColonel26    schedule 19.02.2020