Вопрос

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

Я знаю, что JSLint делает это с помощью Javascript, и мне было интересно, знает ли кто-нибудь хороший способ сделать это.

Например, скажем, пользователь написал код

moose = "barry"
base = 0
if(moose == "barry"){base += 100}

Затем я пытаюсь найти способ прояснить, что выражение «если» находится в правильном синтаксисе, если переменная лось инициализировано и т. Д. Созданный только для этого приложения, так что очень простой и не должен управлять памятью или чем -то в этом роде.

Я думал о разделении сначала по возврату каретки, а затем по пробелу, но нет ничего, что могло бы сказать, что пользователь не напишет что-то вроде moose="barry" или if(moose=="barry")и нечего сказать, что пользователь не будет сохранять результат условия в строке.

Очевидно, что компиляторы и интерпретаторы делают это в гораздо более широком масштабе, но я не уверен, делают ли они это посимвольно и если делают, то как они оптимизировали?

(Другой вариант - я мог бы отправить его обратно в PHP для обработки, что затем освободило бы браузер от ответственности)

Какие-либо предложения?

Спасибо

Вариант использования ограничен, в этом случае синтаксис никогда не будет расширяться, язык представляет собой простой скриптовый язык, позволяющий клиенту создавать уникальную стоимость на основе ввода данных пользователей. Конечный результат будет обработан PHP независимо от того, чтобы гарантировать расчет. не может быть изменен конечным пользователем и обеспечить некоторую согласованность.

Так, например, скажем, существует базовая стоимость в 1,00 фунтов стерлингов, и в форме есть поле, называемое «Дополнительные затраты», язык позволит им манипулировать базовыми затратами относительно поля «дополнительных затрат».

Так

base = 1;
if(additional > 100 && additional < 150){base += 50}
elseif(additional == 150){base *= 150}
else{base += additional;}

Это базовый пример того, как будет использоваться язык.


Спасибо за все ваши ответы, я исследовал анализатор, и создание его было бы гораздо сложнее, чем требуется, чтобы провести несколько тестов с 1000 строк кода и обнаружил, что характер по характеру требуется всего несколько секунд, чтобы обработать даже на обработке даже на Один ядро ​​P4 с 512 МБ памяти (что намного меньше, чем использует клиент)

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

Это заняло всего час, и у меня есть код, который может проверять правильность оператора if и не сбивается с толку вложенными if, пробелами или нечетными выражениями. Осталось проверить очень мало, тогда как синтаксический анализатор и полноценный язык сценариев это заняло бы намного больше времени

Вы все заставили меня задуматься, и я оценил соответствующие ответы, спасибо.

Это было полезно?

Решение

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

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

Я не знаю ни одного легкодоступного генератора парсеров, который генерирует парсеры JavaScript.Парсеры рекурсивного спуска не так уж сложны в написании, но их может быть неудобно поддерживать, и они немного затрудняют расширение синтаксиса (особенно.если у вас нет большого опыта в создании оригинальной версии).

Другие советы

Возможно, вы захотите посмотреть JS/CC который представляет собой генератор синтаксического анализатора, который генерирует синтаксический анализатор для грамматика на Javascript.Вам нужно будет выяснить, как описать свой язык, используя BNF и EBNF.Кроме того, JS/CC имеет собственный синтаксис (который несколько близок к реальному BNF/EBNF) для определения грамматики.Учитывая грамматик, JS/CC сгенерирует синтаксический анализатор для этой грамматики.

Другой вариант, как сказал Пойнти, — написать свой собственный лексер и парсер рекурсивного спуска с нуля.Если у вас есть BNF/EBNF, это не так уж сложно.Недавно я написал парсер EBNF на Javascript (грамматика была довольно простой, поэтому написать один YMMV было не так уж и сложно).

Чтобы ответить на ваши комментарии о том, что это «специфично для клиента».Сюда же добавлю свой опыт.Если вы предоставляете язык сценариев и среду сценариев, нет лучшего пути, чем настоящий синтаксический анализатор.

Обработка особых случаев с помощью множества if-else будет ужасно болезненной и кошмарной для обслуживания.Когда я был первокурсником в колледже, я пытался писать на своем собственном языке.Это было до того, как я что-либо знал о парсерах рекурсивного спуска или просто о парсерах в целом.Я сам понял, что код можно разбить на токены.Оттуда я написал чрезвычайно громоздкий парсер, использующий кучу if-else, а также разбивающий токены по пробелам и другим символам (именно то, что вы описали).Конечный результат был ужасен.

Прочитав о парсерах с рекурсивным спуском, я написал грамматику для своего языка и с легкостью создал парсер за 10-ю часть времени, которое мне потребовалось для написания исходного парсера.Серьезно, если вы хотите избавить себя от боли, напишите действительный парсер.Если вы пойдете по нынешнему пути, вам придется исправлять проблемы навсегда.Вам придется иметь дело со случаями, когда люди помещают пробелы не в то место или, возможно, у них слишком много (или слишком мало) пробелов.Единственная альтернатива — создать чрезвычайно жесткую структуру (т. е. вы должны иметь точно x пробелов после этого утверждения), что может сделать вашу среду сценариев крайне непривлекательной.Настоящий парсер автоматически исправит все эти проблемы.

В Javascript есть функция «eval».

var code = 'alert(1);';
eval(code);

Он покажет предупреждение.Вы можете использовать «eval» для выполнения базового кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top