Как имитировать ввод пользователя (только внутри)?

Мне нужно проанализировать что-то во время выполнения моего плагина eclipse (созданного с помощью Xtext), который затем будет обрабатываться так, как если бы пользователь ввел его, но фактически не всплывает и не отображается для пользователя как ввод самого себя.
Например, у меня есть этот ввод:

for "i" from 1 to 3 do {};

Моя проблема с этим вводом заключается в том, что переменная i не объявлена ​​​​как обычное объявление с «=», но мне нужно, чтобы синтаксический анализатор сказал, что это одно. Итак, я хочу, чтобы парсер анализировал

i = 1;

поэтому он распознает его как обычное объявление и разрешает перекрестные ссылки на него.

Приветствие Крзмбрзл

РЕДАКТИРОВАТЬ:
В общем, я хочу добавить оператор i=1; к АСТ

Я просто хочу иметь поддержку eclipse для существующего языка, поэтому я не пишу ни интерпретатор, ни генератор. Проблема в том, что когда у меня есть цикл for, как указано выше, фактический интерпретатор этого языка объявляет переменную i (или, как бы то ни было, она названа в заголовке цикла), и поэтому эта переменная доступна в теле цикла. В моем случае мой синтаксический анализатор не распознает i как переменную, потому что он знает только, что объявление выполняется через "=", поэтому я не могу использовать i в теле цикла (если я попытаюсь, я получаю сообщение об ошибке, что объявление i не может быть решен). Вот почему я хочу добавить это объявление вручную при создании такого цикла. Мне не нужно беспокоиться о каких-либо сложностях компиляции или интерпретации, потому что я не делаю этого сам. Как я уже сказал, я просто хочу иметь все классные функции eclipse для этого языка.


person Raven    schedule 31.05.2015    source источник
comment
Извините, но не могли бы вы отредактировать свой вопрос, чтобы прояснить, в чем ваша проблема? Я думаю, что это можно решить без добавления i = 1; к AST синтетическим путем.   -  person Joko    schedule 01.06.2015
comment
Это именно то, о чем мой вопрос ... Как добавить это в AST ... Я отредактирую свой вопрос, чтобы сделать его более понятным.   -  person Raven    schedule 01.06.2015
comment
Хорошо, наоборот. Почему вам это нужно? Что вы хотите с этим делать? Я спрашиваю, потому что добавлять оператор в AST — очень плохая идея. Вы реализуете интерпретатор или генератор?   -  person Joko    schedule 01.06.2015
comment
Я обновил свой вопрос с этой информацией   -  person Raven    schedule 02.06.2015


Ответы (1)


Хорошо, теперь я понимаю вашу проблему. Добавлять в AST какой-либо элемент для разрешения любых перекрестных ссылок по-прежнему не рекомендуется! Вы не делаете этого! Вместо этого вы должны попытаться реорганизовать свою грамматику таким образом, чтобы "i" в for "i" from ... было совместимым объявлением переменной. Для этого есть несколько приемов. Вы полностью прочитали документацию Xtext? Также читали книгу Xtext? Оба документа много говорят о том, как заставить Xtext делать то, чего вы не ожидаете.

В любом случае, я часто использую два приема:

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

    AbstractDecl:
        VarDecl | ForVarDecl;
    VarDecl:
        name=ID ...;
    ForVarDecl:
        '"' name=ID '"';
    For:
        'for' decl=ForVarDecl 'from' from=INT 'to' to=INT 'do' block=Block;
    ...
    StatementWithCR:
        ref=[AbstractDecl] ...;
    
  2. Определите любой ParserRule, который возвращает другой тип.

    ForDecl returns VarDecl:
         '"' name=ID '"';
    

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

person Joko    schedule 02.06.2015
comment
Это действительно лучшее решение, и это также помогает мне с другой проблемой, которая у меня была, которая отчасти похожа. Большое тебе спасибо - person Raven; 02.06.2015