Разобрать строку конкретных символов, используя иронию - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь написать анализатор языка с помощью Irony - Language Implement Kit, и у меня возникла проблема.

Я слежу за существующей БНФ для указанного языка. Для определенных случаев требуется определенный синтаксис, то есть строка определенных символов. Я попытался создать Правило, которое принимает любое количество этих символов, и по какой-то причине, которая в настоящее время находится за пределами моего понимания, Irony не может проанализировать (или отсканировать?) Предоставленные строки.

Я попытался максимально упростить попытки выяснить, что я делаю неправильно, и ударился о стену, где я не могу понять, что делает Ирония / почему она не может проанализировать мои данные , Вот упрощенный случай сбоя синтаксического анализатора.

public class TestGrammar : Grammar
{
    public NonTerminal filter = new NonTerminal("filter");
    public NonTerminal values = new NonTerminal("values");
    public NonTerminal value = new NonTerminal("value");

    public TestGrammar() : base(true)
    {
        filter.Rule = values;
        MakeStarRule(values, Empty, value);
        value.Rule = ToTerm("$") | "a" | "b";

        Root = filter;
    }
}

Я выполнил несколько тестовых строк через синтаксический анализатор для вышеуказанной грамматики, и вот результаты:

  • a - успех
  • b - успех
  • $ - успех
  • aa - не удалось
  • ab - не удалось
  • a$ - успех
  • aaa - не удалось
  • aab - не удалось
  • $a - успех
  • $$$ - успех
  • $a$a$a$ - успех
  • $$a$$a$ - успех
  • $$aa$a$ - не удалось

Что это за символы алфавита, которые вызывают это? Я попытался заменить a и / или b другими символами алфавита и получил ту же ошибку.
Я попытался заменить a и / или b на цифры, и проблема исчезла. Я попытался заменить a и / или b на @, и с этим тоже проблем не возникло.

Я пришел к выводу, что Ирония как-то трактует символы латинского алфавита как особые, и это приводит к сбою синтаксического анализа любой строки, содержащей более одного последовательного символа латинского алфавита.

Что я не понимаю о том, как это работает?
Что я делаю не так?

...