Алгоритм интерпретации JavaScript

hohol

Новичок
Всем доброго времени суток, столкнулся с такой задачей:
необходимо интерпретировать JavaScript сценарии в PHP проекте.
Долго и много читал о теории формальных языков, грамматиках над алфавитами etc.
Голова квадратная толку ноль.
Подскажите пожалуйста доступным языком, алгоритмы разбора кода или ссылки на документацию для "чайников".
Зачем такие извращения отвечаю сразу - проект академический, php выбран как самый наглядный для меня язык.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ну как, пиши парсер на конечных автоматах
 

Absinthe

жожо
hohol конечный автомат нужен для лексического анализа - т.е. для разбивания на лексеммы. Кстати в php для php он встроенный есть в виде функции token_get_all($code)
Далее идет этап синтаксического анализа - он и сделает желаемое тобой дерево.
 

hohol

Новичок
hohol конечный автомат нужен для лексического анализа - т.е. для разбивания на лексеммы. Кстати в php для php он встроенный есть в виде функции token_get_all($code)
Далее идет этап синтаксического анализа - он и сделает желаемое тобой дерево.
Понял, а по какому принципу ведётся разбор? Предположим у меня есть пример кода, в дальнейшем вопросы буду задавать по нему.
PHP:
var variable = null;
var someObject = {
	someNumeric: 123,
	someString: "some string"
};
var anotherObject = {
	"anotherNumeric": 123,
	"anotherString": "another \"string\""
}
var someFunction() = function(var1,var2){
//	some actions	
}
Вопрос №1: как определить начало и конец лексемы на примере строки кода:
PHP:
	var variable = null;
Поясню вопрос: как определить что "var" - есть лексема типа VariableDeclaration, а "variable" не есть две лексемы VariableDeclaration(var) и VariableName(iable), а одна лексема VariableName(variable). Или же эти текстовые лексемы определить как NativeTextCode(var) и NativeTextCode(variable), а синтаксическому анализатору вменить в обязанности определять суть лексем типа NativeTextCode? Второй метод усложняет возможность переопределения лексем языка. Для меня это не приемлемо, т.к. JavaScript - не есть конечный язык который необходимо разбирать (вопросы задаю по нему только чтобы вникнуть в тему), в конечном языке предполагается наличие возможности переопределения и дополнения ключевых лексем языка (нетерминальными цепочками).
Если есть мнения о том что мой подход не верен, или я что-то не так понял (что вполне возможно) - объясните что и почему, буду премного благодарен.
 

hohol

Новичок
Absinthe, спасибо за ссылку. Посмотрел, остановил свой выбор на PHP_CodeSniffer'е, почти то что мне нужно (но всё же как пример, а не конечная реализация). У PHP_CodeSniffer'а есть одна проблема, а именно слишком много "лапши" в коде, несмотря на неплохую документированность трудно разобраться что к чему.
Между тем наткнулся на пример реализации лексера с помощью функции preg_split($pattern, $subject, -1, PREG_SPLIT_DELIM_CAPTURE). Соответственно вопрос: какие минусы у такой реализации лексера?
 

hohol

Новичок
Насколько я помню грамматику языка вполне можно описать при помощи регулярных языков(мета-символов). PCRE - регулярный язык(и очень даже язык мета-символов). Или я что-то путаю?
 

zerkms

TDD infected
Команда форума
hohol
Устанете описывать.

А споткнётесь вы даже на описании парсера примитивных выражений: с бесконечным числом операндов, 4 арифметическими операторами и скобками
 

Absinthe

жожо
hohol хватит вопросов. Напиши сраный лексер классическим способом.
Это будет пара десятков строк. Уж быстрее, чем спрашивать на форуме.
 

hohol

Новичок
hohol хватит вопросов. Напиши сраный лексер классическим способом.
Это будет пара десятков строк. Уж быстрее, чем спрашивать на форуме.
Я же не против, просто я не понимаю алгоритма разбора, поэтому и спрашиваю что и как.
Можете продемонстрировать пример (не код, а алгоритм) разбора некоторого текста, в котором лексемами являются слова и целые выражения взятые в кавычки (игнорируя прерывание выражения экранированными кавычками). Дальше, я думаю, сам разберусь. Вообщем-то для этого тему и создавал.
 

fixxxer

К.О.
Партнер клуба
кстати, самая первая реализация javascript была написана за неделю =)
 
Сверху