Ирония Разбор списка с пробелами - PullRequest
1 голос
/ 12 февраля 2020

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

1 Ответ

1 голос
/ 19 февраля 2020

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

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

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

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

...