Проверка семантики кода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проверка семантики кода

Сообщение ger_kar » 19.04.2012 (Чт) 17:43

jangle писал(а):Я разве описал алгоритм переведенным тобой способом?
Нет конечно, я просто выделил как мне показалось противоречия, хотя еще раз прочитал, теперь, после второго прочтения все стало вполне логичным.
jangle писал(а):Разумеется нет, эта позиция есть в таблице лексического анализатора, под которой лежит EOL, лексема на которой алгоритм заканчивает свою работу и выводит сообщение об ошибке. Чтобы он указывал на последнюю незакрытую скобку, нужно просто добавить соответствующий код.
Ну вообще привычная ситуация, когда указывается строка и позиция в строке. Так компиляторы все собственно и поступают и как догадаться что это не позиция символа в строке, а позиция в таблице анализатора?
Бороться и искать, найти и перепрятать

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 20.04.2012 (Пт) 9:49

Ну вообще привычная ситуация, когда указывается строка и позиция в строке. Так компиляторы все собственно и поступают и как догадаться что это не позиция символа в строке, а позиция в таблице анализатора?


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

Код: Выделить всё
#Compile Exe
#Dim All
Function PBMain () As Long
Dim x As Long
x=(Sin(1)+2)* Cos((1)
End Function   


Сообщение об ошибке

Код: Выделить всё
Welcome to PB/Win IDE 10.03
Saving files...
Files saved.
Compiling "C:\temp\TEST.bas"
Error 414 in C:\temp\TEST.bas(7:023):  ")" expected
  Line 7:  x=(Sin(1)+2)* Cos((1) 

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 14.05.2012 (Пн) 23:54

VBTerminator писал(а):Ага, учитывая, что (согласно MSDN) львиная доля API появилось только в Win2000.

Ну вот, они уже поменяли лвиную долю на Windows XP.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проверка семантики кода

Сообщение ger_kar » 15.05.2012 (Вт) 8:07

И нафига это было делать? Потенциально вводить в заблуждение? Вот дурни. И где теперь истину узнавать?
Бороться и искать, найти и перепрятать

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 15.05.2012 (Вт) 11:08

ger_kar писал(а):И нафига это было делать? Потенциально вводить в заблуждение? Вот дурни. И где теперь истину узнавать?


win32.hlp - the Win32 Programmer's Reference

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 15.05.2012 (Вт) 16:03

"Чтобы понять как работает синтаксический анализатор, достаточно один раз написать его, и после этого вы будете писать их не задумываясь..." (c) Мартин Фаулер. Предметно-ориентированные языки программирования.

Мартин забыл рассказать, как написать анализатор в первый раз! :mrgreen:

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Проверка семантики кода

Сообщение burik » 19.05.2012 (Сб) 18:46

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

Вот правда в VB, насколько я знаю, ANTLR генерировать не умеет. Тут вопрос принципиальности использования VB (если интересует именно написание компилятора, то, вероятно, не принципиален язык написания), можно так же посмотреть на аналогичные инструменты - может есть и для VB. В любом случае, рекомендую ознакомится и разобраться в принципе работы сгенерированных ими лексеров / парсеров.

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

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

Основной продукт работы синтаксического анализатора (в случае успешного разбора) - дерево разбора, оно отражает структуру текста (программы) и используется далее семантическим анализатором. Так же на этапе работы синтаксического анализатора часто строятся дополнительные структуры (вроде таблиц переменных / функций / пользовательских типов) - это может упростить семантических анализатор.

Ну а дальше генерация целевого кода.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 20.05.2012 (Вс) 4:50

Ерунда эти все инструменты. Кроме каких-нибудь студентов, или там аспирантов, ими никто серьёзно не пользуется. Я имею в виду, что если взять какой-нибудь серьёзный широко известный компилятор, то можно обнаружить, что там внутри всё very custom, а не very classic.

burik писал(а):Каждое правило (как уже писал Хакер) можно реализовать в виде функции, которой в качестве параметра передается входной поток токенов. Функция эта может просто возвращать булевское значение (подходит ли входной поток под правило), может возвращать и некоторый объект (например, AST дерево, дерево разбора и т.п.).

Я такого никогда не говорил. Я совершенно другое говорил. Я говорил, что должно быть семейство функций (с каждой из которых может быть, а а может и не быть ассоциирована доп. таблица). Каждая парочка функция + таблица — по моей терминологии «роутер».

Диспетчер вызыват роутер. Роутер получает указатель (или не указатель) на контекст процессинга. Контекст всецело зависит от задачи решаемой сейчас конструкцией из множества роутеров. У каждого роутера задача примитивна: посмотреть на контекст и, в зависимости от него, вернуть адрес следующего роутера, которого разгребать это всё дальше. Роутер при этом может изменить что-то в контексте (например передвинуть какой-нибудь указатель/счётчик в контексте на единичку вверх (или не вверх, а вниз, или не на единичку), или просто добавить что-нибудь куда-нибудь (какой-нибудь элемент в какой-нибудь список). Я это называю — побочный эффект работы роутера.

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

Сам процесс обработки кода разбивается на этапы-слои. Каждая конструкция из роутеров обрабатывает только свой слой.

Самую большую глупость из данной области, которую я только видел, и которую постоянно вижу там или иначе: стремление написать одну единственную функцию, которая сделают всю работу сразу. То есть получит на вход некоторый код, а на выходе сразу даст дерево разбора и вспомогательне таблицы/словари.

Это шизофренично. Разбивайте задачу на слои. Делайте компоненты, которые получают поток сущностей (ни в коем случае речь не о токенах, речь об абстрактных сущностях в контексте программирования вообще), и выдают поток сущностей. Делая редкие малые изменения или даже, в каких то случаях, не делая вообще никаких изменений. Своеобразный приём из Unix-Way: куча мелких программ, которые делают одну маленькую задачу, но делают её хорошо. А вы потом берёте эти программы, и организуете конвеер:

Код: Выделить всё
cat input_data | tool1 | tool2 | tool3 | tool4 | tool5 | tool6 | > output_data


Для тех, кто не понял намёка: я абсолютно не не имею в виду, что вы должны писать компоненты разбора в виде отдельных маленьких программ, которые бы потом запускали в конвейере используя пайпы. Я о том, что у вас должна быть такая же архитектура разбора, состоящая из компонентов, который принимают вывод предыдущего компонента, и дают свой вывод на вход следующему компоненту. Все компонененты должны быть изолированы друг-от-друга на уровне кода (вообще говоря, они не кому не должны, но если у вас так — вы на правильном пути).

У вас не должно возникать вопроса о том, как написать функцию, которая из исходного кода сгенерирует дерево разбора.
У вас должен возникнуть вопрос о том, как написать функцию, которая делает 1-ый этап, 2-ой этап, 3-ий этап, 4-ый этап... и так далее, сколько этапов вы у себя сделаете.

Решение каждого этапа — сложная, но интересная задача, и каждый этап будет использовать отличные от других принципы функциониварояни.

А вот если у вас возникнет вопрос о том «как написать функцию, которая из исходного кода сгенерирует дерево разбора», то ответ будет таким: взять исходные данные и применить к ним последовательно все этапные функции, которые у вас там есть в проекте.

_______

Что касается вообще подхода, как «взять исходный код, и, пусть и поэтапно, но сделать из него дерево разбора». Вот VB и VBA вообще не используют этот подход. Эти продукты никогда не пробегают по коду и не разбирают их в дерево. Вместо этого они перестраивают дерево по мере правки кода.

Да и нет там дерева, как такового. Есть пресловутые этапы. Часть этапов выполняется по мере правки кода в среде (номера которых ближе к единице). Часть этапов выполняется при нажатии кнопки «Run» или «Compile».

[url=bbs.vbstreets.ru/viewtopic.php?f=9&t=43832]Почитай, как оно устроено[/url].

Разработчики VB/VBA имели смелость не только не использовать готовые неприятные инструменты ANTLR, Lex и Yacc. Они имели смелость заложить в свой продукт вообще такой принцип работы, который нигде в мире больше не используется.

Это сделало VB/VBA — продуктом, в котором очень быстрое, самое быстрое из всего, что есть, время компиляции больших проектов.
И это же сделало VB/VBA — продуктом, в котором очень медленное время загрузки больших проектов.

Потому что при компиляции практически ничего не делается (все изменения внутренних структур (деревьев, таблиц, словарей) происходят при правке кода, а не при нажатии кнопки «Compile»), и потому что при загрузке проекта всё это надо построить с нуля.

И знаете, я ставлю 5 баллов за такое решение: ибо в процессе работы программиста ему приходится компилировать свой проект в своей среде разаработке в 10 или 100 раз чаще, чем открывать свой проект с своей среде разработки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 22.05.2012 (Вт) 10:26

А мне возможно дадут задачу как раз на тему парсинга. :albino:
Нужно будет делать интеграцию нашей ГИС с ArcGis Server заказчика. Прикол в том, что ArcGis Server будет запрашивать у нас данные по протоколу ArcGIS Server REST API, а возвращать данные ему надо в JSON, в примерно таком виде:

Код: Выделить всё
{
  "objectIdFieldName" : "objectid",
  "globalIdFieldName" : "",
  "geometryType" : "esriGeometryPoint",
  "spatialReference" : {
    "wkid" : 4326
  },
    "fields" : [
    {
      "name" : "objectid",
      "type" : "esriFieldTypeOID",
      "alias" : "Object ID"
    },
    {
      "name" : "datetime",
      "type" : "esriFieldTypeDate",
      "alias" : "Earthquake Date",
      "length" : 36
    },
    {
      "name" : "depth",
      "type" : "esriFieldTypeDouble",
      "alias" : "Depth"
    },
    {
      "name" : "eqid",
      "type" : "esriFieldTypeString",
      "alias" : "Earthquake ID",
      "length" : 50
    },
    {
      "name" : "latitude",
      "type" : "esriFieldTypeDouble",
      "alias" : "Latitude"
    },
    {
      "name" : "longitude",
      "type" : "esriFieldTypeDouble",
      "alias" : "Longitude"
    },
    {
      "name" : "magnitude",
      "type" : "esriFieldTypeDouble",
      "alias" : "Magnitude"
    },
    {
      "name" : "numstations",
      "type" : "esriFieldTypeInteger",
      "alias" : "Number of Stations"
    },
    {
      "name" : "region",
      "type" : "esriFieldTypeString",
      "alias" : "Region",
      "length" : 200
    },
    {
      "name" : "source",
      "type" : "esriFieldTypeString",
      "alias" : "Source",
      "length" : 50
    },
    {
      "name" : "version",
      "type" : "esriFieldTypeString",
      "alias" : "Version",
      "length" : 50
    }
  ],
  "features" : [
    {
      "geometry" : {
        "x" : -178.24479999999991,
        "y" : 50.012500000000045
      },
      "attributes" : {
        "objectid" : 3745682,
        "datetime" : 1272210710000,
        "depth" : 31.100000000000001,
        "eqid" : "2010vma5",
        "latitude" : 50.012500000000003,
        "longitude" : -178.2448,
        "magnitude" : 4.7999999999999998,
        "numstations" : 112,
        "region" : "Andreanof Islands, Aleutian Islands, Alaska",
        "source" : "us",
        "version" : "Q"
      }
    },
    {
      "geometry" : {
        "x" : -72.865099999999927,
        "y" : -37.486599999999953
      },
      "attributes" : {
        "objectid" : 3745685,
        "datetime" : 1272210142999,
        "depth" : 40.600000000000001,
        "eqid" : "2010vma4",
        "latitude" : -37.486600000000003,
        "longitude" : -72.865099999999998,
        "magnitude" : 4.9000000000000004,
        "numstations" : 58,
        "region" : "Bio-Bio, Chile",
        "source" : "us",
        "version" : "7"
      }
    }
  ]
}


Грубо говоря, нужен свой "самопальный" вариант ArcGIS Server который будет понимать семантику REST API, и "компилировать" результат запроса в JSON и отдавать его в ArcGIS. Проще конечно купить копию ArcGIS Server, но она стоит 2 миллиона рублей, и руководство решило, что мы сможем изобрести свой велосипед.
Посокольку в этом проекте разрешено использовать VB, я решил за него взяться.
Хотя с моей точки зрения, задача практически нереализуема для обычных программистов.
Последний раз редактировалось jangle 22.05.2012 (Вт) 10:33, всего редактировалось 1 раз.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проверка семантики кода

Сообщение ger_kar » 22.05.2012 (Вт) 10:32

Будь бы это контора в которой работал бы я, то я бы присоветовал нанять для этих целей Хакера. Он как раз необычный.
Бороться и искать, найти и перепрятать

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 22.05.2012 (Вт) 10:35

ger_kar писал(а):Будь бы это контора в которой работал бы я, то я бы присоветовал нанять для этих целей Хакера. Он как раз необычный.


Возможно лучше, но Хакера у нас нет, поэтому придется обходится своими силами.

Кстати на тему JSON, есть парсер для VB6 с исходниками. Взять можно тут

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 22.05.2012 (Вт) 11:39

burik писал(а):Основной продукт работы синтаксического анализатора (в случае успешного разбора) - дерево разбора, оно отражает структуру текста (программы) и используется далее семантическим анализатором. Так же на этапе работы синтаксического анализатора часто строятся дополнительные структуры (вроде таблиц переменных / функций / пользовательских типов) - это может упростить семантических анализатор.

Ну а дальше генерация целевого кода.


Мне кажется можно упростить компилятор и обойтись без дерева разбора.
Поскольку уже есть заполненная таблица лексем где для каждого токена определена область видимости, положение в исходном коде и т.д. Добавляем семантический анализатор, который вызывает функцию соответствующую текущему токену. Эта функция сама знает сколько данных ей взять из таблицы лексем и как их обработать и потом на какое число увеличить указатель лексем, чтобы он указывал не следующий токен.
В случае некорректных данных, функция записывает в таблицу ошибок сообщение, с указанием положение токена, номер строки и позиция токена берется из таблицы лексем. Затем функция возвращает управление СП чтобы тот приступил к обработке следующей лексемы.

Безымянный.PNG
Безымянный.PNG (17.67 Кб) Просмотров: 2838

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 22.05.2012 (Вт) 11:41

Фигня.

Продолжается исповедование подхода «сделать всё и сразу» одним проходом. Это 100 процентов абсолютно проигрышный бесперспективный ход.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 22.05.2012 (Вт) 11:57

Хакер писал(а):Фигня.

Продолжается исповедование подхода «сделать всё и сразу» одним проходом. Это 100 процентов абсолютно проигрышный бесперспективный ход.


Да нет же. Проходов получается как минимум четыре.

1-ый проход: Препроцессор, для подключение всех инколюдов.
2-ой проход: Построение таблицы лексем из исходного кода.
3-ый проход: Чтение токенов из таблицы лексем и вызов соответствующих им функций обработки.
4-ый проход: Чтение байтов из массива сгенерированного кода и сохранение их на диск в виде файла.

Для чего тут еще нужны проходы? Нет смысла усложнять очевидное.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проверка семантики кода

Сообщение ger_kar » 22.05.2012 (Вт) 12:40

Хакер писал(а):Самую большую глупость из данной области, которую я только видел, и которую постоянно вижу там или иначе: стремление написать одну единственную функцию, которая сделают всю работу сразу. То есть получит на вход некоторый код, а на выходе сразу даст дерево разбора и вспомогательне таблицы/словари.
А чем это так плохо? Трудно будет потом расширять или модернизировать?
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 22.05.2012 (Вт) 13:23

jangle писал(а):1-ый проход: Препроцессор, для подключение всех инколюдов.
2-ой проход: Построение таблицы лексем из исходного кода.
3-ый проход: Чтение токенов из таблицы лексем и вызов соответствующих им функций обработки.
4-ый проход: Чтение байтов из массива сгенерированного кода и сохранение их на диск в виде файла.

Для чего тут еще нужны проходы? Нет смысла усложнять очевидное.


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

Хм... звучит неплохо. Но 99,999 процентов сложнейшей работы находится внутри «функции обработки». Но ты оставил её как чёрный ящик. Решил не писать, что она делает и какой принцип её работы. Хотя важен именно он, а всё остальное кроме него — наоборот, практически не имеет значимости.

Этапа должно быть не 4 (ха-ха), а 24 или 44.

Фраза «нет смысла усложнять очевидное» вызывает у меня грустную улыбку. Закон Мерфи, пункт 1.

Пункт 2 и пункт 4 твоего списка отличаются по трудоёмкости на 10 порядков. Пункт два следовало бы расписать 1000-ю пунктов, пункт 4 следовало бы не писать ввиду предельно низкой важности по сравнению со всем остальными пунктами.

А так это похоже на план по зарабатыванию миллиарда:
  • Почесать левую ногу
  • Почесать правое ухо
  • ?????????
  • PROFIT!
Один в один.

Ты это специально, или ты сам не осознаёшь этого?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 22.05.2012 (Вт) 14:46

Хакер писал(а):Хм... звучит неплохо. Но 99,999 процентов сложнейшей работы находится внутри «функции обработки». Но ты оставил её как чёрный ящик. Решил не писать, что она делает и какой принцип её работы. Хотя важен именно он, а всё остальное кроме него — наоборот, практически не имеет значимости.


Да я писал, что вся логика содержится там. Решил не писать потому как очень много букв получается. Ну вот пример небольшой. Допустим есть такой псевдокод, который надо скомпилировать

Код: Выделить всё
Funct HELLO (x, y)
Call  Rtl_MessageBox (x + y)
End Funct


Лексический анализатор разбивает код на токены и загоняет его в таблицу. Затем семантический анализатор начинает читать таблицу лексем, первый токен "Funct", его обрабатывает функция VB_Funct, ей передается управление.
VB_Funct устанавливает указатель токенов на +1 и читает название функции HELLO, пробегает по таблице функций и если функции с таким названием не было, добавляет в таблицу функций HELLO. И устанавливаем переменную текущей области видимости c GLOBAL на HELLO. Затем устанавливаем указатель лексем +2 и проверяем наличие открывающей скобки, если она есть, кладем ее на стек скобок и начинаем циклически читать входные переменные функции, и заносить их в отдельную таблицу HELLO.x, HELLO.y. До тех пор пока не встретится закрывающая скобка, символ конца строки, или иной токен из класса разделителей. Если это была закрывающая скобка, то снимаем скобку со стека и проверяем его состояние. Если стек пуст, значит скобочное выражение сбалансированное.
Следующий токен Call вызываем функцию VB_Call, она устанавливает указатель лексемы +1 и читает название вызываемой функции Rtl_MessageBox. Это ран-тайм функция компилятора, добавляем ее в массив CODE функции HELLO. Следующий токен открывающая скобка, кладем ее на стек скобок. Затем идет переменная X, проверяем ее наличие в текущей области видимости. HELLO.X есть как и HELLO.Y. Затем закрывающая скобка, опять смотрим сбалансированность стека скобок, если ок то дальше.
END - VB_End, указатель токенов +1 читаем Funct, все область функции и видимости HELLO закончилась, переменную области видимости меняем на GLOBAL
--------------------------

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 22.05.2012 (Вт) 14:52

Ну, это в точности соответствует вот этому.
Во-первых, непонятно, код на каком языке ты собрался обрабатывать? VB или какой-то свой уровец-мутант?

Во-вторых, описанная логика работы примитивна и подходит только для описанного выше примера. В реальной жизни всё куда сложнее.


И вообще, у меня такое впечатление, что вместо того, чтобы впитывать как губка и слушать, как надо, пытаешься всем показать что ты (якобы) и сам знаешь, как надо, и уверен, что у тебя получится. Тогда может мне стоит просто со стороны смотреть на это?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 22.05.2012 (Вт) 15:51

Хакер писал(а):Во-первых, непонятно, код на каком языке ты собрался обрабатывать? VB или какой-то свой уровец-мутант?


Мутант. VB слишком сложен. Вообще хочу разобраться как это должно работать. Сделать компиляцию некого псевдоязыка в VB например.

Во-вторых, описанная логика работы примитивна и подходит только для описанного выше примера. В реальной жизни всё куда сложнее.


Не спорю что сложнее, поэтому и тему эту создал.

И вообще, у меня такое впечатление, что вместо того, чтобы впитывать как губка и слушать, как надо, пытаешься всем показать что ты (якобы) и сам знаешь, как надо, и уверен, что у тебя получится.


Может для понятности приведешь пример правильного кода? А то от словоблудия мало толку, можно понять и так и этак, а в результате все не так оказывается.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 22.05.2012 (Вт) 16:00

jangle писал(а):Может для понятности приведешь пример правильного кода? А то от словоблудия мало толку, можно понять и так и этак, а в результате все не так оказывается.


Я уже как-то высказывался об инициативе написать на VB полноценный компилятор C. Ну, разве что, может быть не настолько строго следующий стандарту, чтобы не тратить на это время, ведь пример чисто учебный. И показать на примере серии топиков, по шагам, как это делается.

Но это в моём списке приоритетов стоит не на первом месте, так что покаааа до этого дело дойдёт. Сначала многопоточный кирпич, потом FNDLL, потом много недописанных статей в МануAll, и только потом может быть это.

В общем, много. Причём много кода просто на этапе конвертации «последовательность символов —> последовательность токенов». А уж дальше — ещё больше кода.

Какие-то отдельные вещи с чётко оговоренными границами конечно мог бы показать.

И да, самое главное: подход при написании компилятора С/С++ — один. Подход при написании компилятора VB — абсолютно другой. Тут зависит от самого языка. Как сделан VB5, VB6, VBA я уже говорил. И сделано он так не с проста. Хочешь VB-подобное — делай как они делали.

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

В С/С++ стоит в начале исходника напакостить, пусть даже вставкой одного лишнего символа, или удалением одного нужного. Как результат — полностью рущится база IntelliSense, а попытка компиляции выдаёт 1000 сообщений об ошибках на протяжении всего файла.
В VB можно пытаться пакостить как угодно: вставлять куда угодно кривые строчки, вставлять посреди исходника процедуры без End Sub. Это не приводит ни к падению базы IntelliSense, ни к тому, что на 3000-строчном исходнике сыпется 15000 ошибок.

Тебе какой подход по нраву?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 22.05.2012 (Вт) 16:44

Хакер писал(а):Я уже как-то высказывался об инициативе написать на VB полноценный компилятор C. Ну, разве что, может быть не настолько строго следующий стандарту, чтобы не тратить на это время, ведь пример чисто учебный. И показать на примере серии топиков, по шагам, как это делается.


Полноценный компилятор это слишком сложно. Мне приходилось видеть компиляторы на VB. Понять код без пояснений автора очень сложно. Особенно если внутри DSL-структура проекта. Проще самому разобраться и написать аналог.
Если было бы что-то простое, с разъяснениями то было бы интересно.

Какие-то отдельные вещи с чётко оговоренными границами конечно мог бы показать.


Ну например, есть поток токенов какого-то примитивного псевдоязыка из 2-3 ключевых слов. Нужно выполнить синтаксический анализ этого потока и сгенерировать выходной VB-код или VBScript (например показать Хелло Ворлд)
Это сложно сделать?

Хочешь VB-подобное — делай как они делали.


Пока нет, слишком сложно.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проверка семантики кода

Сообщение ger_kar » 22.05.2012 (Вт) 17:30

Я кстати наблюдаю за этой темой с большим интересом, то что пишет jangle, правильно или нет, но это для меня является понятным. Например этот пост..
Хакер писал(а):Я уже как-то высказывался об инициативе написать на VB полноценный компилятор C. Ну, разве что, может быть не настолько строго следующий стандарту, чтобы не тратить на это время, ведь пример чисто учебный. И показать на примере серии топиков, по шагам, как это делается.
Это конечно хорошо-бы но слишком долго, а вот если бы на тот-же примитивный пример ты написал бы свой вариант, такой же небольшой, я думаю ситуация бы значительно прояснилась. А то это напоминает рулончик скотча в котором никак не возможно найти кончик, который едва заметен, но если его найти, то можно аккуратно размотать и весь рулон. Так и здесь, возможно написанный тобой небольшой, но конкретный пример будет моментом истины и тем самым кончиком с которого можно начать весь этот рулон разматывать? А заодно и посмотреть разницу с тем подходом, который описал jangle
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 22.05.2012 (Вт) 18:35

jangle писал(а):Ну например, есть поток токенов какого-то примитивного псевдоязыка из 2-3 ключевых слов. Нужно выполнить синтаксический анализ этого потока и сгенерировать выходной VB-код или VBScript (например показать Хелло Ворлд)
Это сложно сделать?

С такой формулировкой проблемы я ничем не могу помочь. Больше конкретики.

И опять же, хватит подходить к задаче с таким настроем, как будто вы пишите функцию, единственной целью которой является сказать: да, match, текст соответствует всем правилам, или нет, does not match.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.05.2012 (Вт) 22:32

Моё мнение (Хакер, сильно не ругайся ;)): Любую программу можно без принципиальных проблем распарсить аналогично арифметическому выражению с унарными операторами различных приоритетов и операторами последовательности, получив при этом расширение допустимого синтаксиса (т. е. корректным станет больше чем должно быть).

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 23.05.2012 (Ср) 9:41

Хакер писал(а):С такой формулировкой проблемы я ничем не могу помочь. Больше конкретики.


Ну тогда трансляция VBScript в JavaScript. Не весь язык конечно, а только некоторые сущности, например:

1. Объявление переменных. Глобальные и локальные. Dim
2. Присвоение переменным текстовых строк.
3. Процедуры - SUB
4. Вывод содержимого переменной через MsgBox

Это подмножество языка компилируется в JavaScript, файл с расширением .js
Практически полноценный компилятор.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 23.05.2012 (Ср) 9:43

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

Куда более приятной была бы задача сделать конвертор JS ---> Псевдокод с кастомной виртуальной машиной.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 23.05.2012 (Ср) 10:02

Какой практический смысл компилировать JavaScript в псевдокод виртуальной машины?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 23.05.2012 (Ср) 10:02

Для демонстрации того, как это делается.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Проверка семантики кода

Сообщение jangle » 23.05.2012 (Ср) 10:06

Тогда уж лучше сразу в машинный код. Будет уникальный проект. Хотя где-то в интернете мелькали программы для компиляции JavaScript в EXE

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проверка семантики кода

Сообщение Хакер » 23.05.2012 (Ср) 10:16

Ради чего? Это же (если (бы) это кто-то (я) стал делать) позиционировалось бы только как обучательный демо-пример. Он показывает общие принципы, правильные подходы, паттерны так сказать, а не конкретное дело.

К тому же, нет абсолютно никакого смысла, бенифита и профита от того, что JS будет компилироваться в Native-код. Язык с динамической типизацией, всё разруливается в рантайме, так что машинный код будет состоять из одних только инструкций CALL.

А вот с псевдокодом было бы интересно, инструкции играли бы роли индексов в массиве указателей на реализации базовых операций виртуальной машины, которая оперировала бы характерными для JS сущностями.

Конвертацию «инструкции ассемблера» (текст) —> «машинный код» (бинарные данные) я писал года 4 назад на С. Так вот, конечно её можно написать на VB, вообще никакой проблемы, но отсутствие двух вещей: битфиелдов и возможности сделать так:

Код: Выделить всё
Dim SomeArrayOfSomeStructs(1000) =
    { a, b, c, {d, e, f}, g, h, {i, j, k}, l, },
    { a, b, c, {d, e, f}, g, h, {i, j, k}, l, },
    { a, b, c, {d, e, f}, g, h, {i, j, k}, l, },
    ......
    { a, b, c, {d, e, f}, g, h, {i, j, k}, l, }.


Удручают неимоверно. Написание конкретно преобразователя в x86-код на VB возможно, но очень уж неудобно из-за невозможности объявить глобальный (или хотя-бы) локальный прединициализированный массив структур.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 62

    TopList