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