Я пытаюсь определить переменные в стиле PHP в Ирония примерно так:
variable.Rule = "$" + identifier;
Прекрасно работает, за исключением того, что вы можете ставить пробелы между $
и identifier
.Я хочу предотвратить это.Как?
Нужно ли создавать новый настраиваемый терминал?Если да, смогу ли я воспользоваться магией IdentifierTerminal
?
Копаться в IdentifierTerminal
Я вижу, что на самом деле есть флаг для "NameIncludePrefix", но он используется только в одномместо.Похоже, префикс хранится в этом CompoundTokenDetails
объекте ... который я не знаю, как использовать. Редактировать: Не важно, это был тупик.Эти флаги предназначены для добавления модификаторов к поведению переменной.
Это вроде работает ...
class VariableTerminal : Terminal
{
public VariableTerminal(string name) : base(name)
{
}
public override IList<string> GetFirsts()
{
return new[] { "$" };
}
public override Token TryMatch(ParsingContext context, ISourceStream source)
{
if (source.PreviewChar != '$') return null;
do
{
source.PreviewPosition++;
} while (!source.EOF() && char.IsLetter(source.PreviewChar));
var token = source.CreateToken(OutputTerminal);
return token;
}
}
Хотя я не совсем уверен, что такое OuputTerminal
..Я предполагаю, что это какое-то динамическое свойство, основанное на текущей позиции предварительного просмотра?То, как в Иронии выполняется синтаксический анализ, кажется немного странным ...
В любом случае, проблема в том, что когда я использую этот VariableTerminal
вместо того, как я делал это раньше с "$" + IdentifierTerminal"
, когда есть синтаксическая ошибка, такая как в этом коде:
p cat
Терминал идентификатора имел обыкновение говорить
Синтаксическая ошибка, ожидаемая: {настоящая строка $ true false ...
Но переменная выдаёт мне эту ошибку вместо:
Недопустимый символ: 'c'
Предыдущая ошибка была более полезной. Iсчитать.Я не очень понимаю, почему он выдает другую ошибку ... как я могу заставить его сказать это вместо этого?