PEG.js: как использовать подсказку?

Я создаю анализатор C++ с помощью PEG.js, и мне нужно иметь возможность использовать cin. С JS после матча, когда я использую prompt(), (альтернативная) онлайн-версия выдает ошибку "Ошибка анализа : подсказка не определена'. Я пытаюсь использовать инициализатор для создания функции для репликации prompt (вероятно, не оптимизированной, я просто пробовал ее как решение). Однако, когда я это делаю, это все равно дает мне ошибку. Я также пытался использовать window.prompt, но опять же, это не работает. Вот пример того, что я делаю:

{
    function cin() {
        window.prompt("");
    }

    function changeVar(variable, newValue) {
        if(typeof variable === typeof newValue) {
            variable = newValue;
        } else if(typeof variable === 'undefined') {
            alert("You can't assign a value to a variable if the variable isn't declared yet!");
        } else {
            alert("Bad assignment. In C++, a variable *must* have the same type *all the time*.");
        }
    }
}

stdin =
    whitespace* "std::cin" whitespace* ">>" whitespace* varToBeChanged:[a-zA-Z_]+ ";" whitespace*
        { changeVar(varToBeChanged, cin('')); return varToBeChanged; }

whitespace =
    space:[ \t]
        { return space; }

а затем в поле тестирования парсера:

std::cin >> variable;

Спасибо, что посмотрели. Я пробовал это искать в Google и SO-искать, но не нашел никаких результатов.

Кроме того, вот основной фрагмент кода со всей (текущей) дополнительной информацией, которая может понадобиться . У меня тоже есть некоторые проблемы с этим, но я попытаюсь разобраться в них самостоятельно, прежде чем задавать еще один вопрос.


person Alonessix    schedule 12.05.2014    source источник
comment
Почему вам нужно использовать prompt для анализа строки cin? Не знаю, что ты здесь делаешь.   -  person Bergi    schedule 13.05.2014
comment
Кто-то удалил правильное форматирование PEG.js. Предполагается, что последняя строка заключена в {}, что позволяет выполнять JS внутри, если std::cin >> [a-zA-Z_] совпадает. Это не для синтаксического анализа, а для фактического принятия мер, когда найдена строка, упомянутая выше. Кроме того, на случай, если вы запутались, changeVar — это просто функция для изменения значения переменной без изменения ее типа.   -  person Alonessix    schedule 13.05.2014
comment
Я неправильно понял, как работает PEG.js, видимо, это не только парсер, но и интерпретатор. Я отменил изменения синтаксиса.   -  person Bergi    schedule 13.05.2014
comment
Не могли бы вы расширить правила, чтобы создать SSCCE (т. е. добавить отсутствующие whitespace и changeVar определения)? Кстати, как только я добавил их в онлайн-версию, синтаксический анализатор работает хорошо.   -  person Bergi    schedule 13.05.2014
comment
Готово. Я также добавил ссылку на свою работу до сих пор. Это также может помочь вам в попытке решить эту проблему. Спасибо за помощь!   -  person Alonessix    schedule 13.05.2014


Ответы (1)


Если вы используете http://peg.arcanis.fr/, код синтаксического анализатора выполняется внутри Web Worker, который не имеет доступа ни к какому пользовательскому интерфейсу, например window или DOM. Ошибка "undefined variable" буквально означает, что window или prompt не объявлены.

Если вы вставляете свой код в http://pegjs.majda.cz/online, он выполняется в среду веб-страницы и работает безупречно.

person Bergi    schedule 13.05.2014