Создан проект, в котором пользователь набирает программный код в поле Memo.
Как заставить мой проект проверять синтаксис введённого кода и выдать какая именно ошибка встречается первой?
И если в Memo всё написано правильно, как его откомпилировать с конкретными вводом начальных данных?
Другие языки программирования и технологии
Lazarus. В Компиляция внутри exe
Если делать всё по науке, то это просто.
Сначала набранный текст обрабатываете лексическим сканером (анализатором) . На этом этапе в тексте выделяются лексемы входного языка: ключевые слова, символьные и цифровые литералы, имена переменных. Составляется таблица имен переменных. Ключевые слова и зарезервированные символы лучше заменить на псевдокод и составить из этих кодов преобразованный текст программы - это упростит анализ текста на следующих этапах. Также можно получить численные значения констант. Лексическим сканером не так уж и много можно выявить ошибок, например, неправильную запись чисел, но лучше это оставить следующим анализаторам.
На втором этапе полученный псевдокод скармливается синтаксическому анализатору. Он вылавливает львиную долю ошибок - неправильное следование или пропуск ключевых слов, встреча различных литералов в неожиданных местах, не соответствующих синтаксису языка. При написании этого анализатора вам поможет теория формальных грамматик. Если грамматика языка не автоматная, то.. .
...следующим этапом будет семантический анализатор. Он выявит неправильное использование скобок, кавычек, выход за допустимые пределы значений, найдёт неинициализированные и недекларированные переменные. Все три этих анализатора могут быть совмещены или частично включаться друг в друга. Выяснять размер выделяемой под переменные память может как синтаксический, так и семантический анализатор.
Далее для более удобной компиляции следует преобразовать уже проверенный псевдокод в ПолИЗ (постфиксную запись) , хотя это и не обязательно, но структура программы будет ближе к программе на машинном коде для непосредственного выполнения процессором.
Затем можно приступить к компиляции либо сразу в машинный код, либо в текстовый файл (как препроцессор для ассемблерного компилятора) . Самый простой способ - иметь откомпилированные (но не слинкованные) объектные файлы или текстовые файлы inc с реализацией операторов и функций языка.
Тогда вам останется передавать значения переменных и констант в стек или загружать в регистры и вызывать соответствующие подпрограммы инструкцией call.
Осталось откомпилировать и слинковать полученные исходники внешним транслятором ассемблера и вы получите экзешник введённой программы.
Разумеется, можно не компилировать программу, а реализовать операции языка средствами паскаля (т. к. в вашем случае используется Lazarus), но это уже будет интерпретатор и автономно запустить программу не удастся.
P.S. Про оптимизацию кода не упоминаю, так как для ваших целей это вряд ли понадобится.
Сначала набранный текст обрабатываете лексическим сканером (анализатором) . На этом этапе в тексте выделяются лексемы входного языка: ключевые слова, символьные и цифровые литералы, имена переменных. Составляется таблица имен переменных. Ключевые слова и зарезервированные символы лучше заменить на псевдокод и составить из этих кодов преобразованный текст программы - это упростит анализ текста на следующих этапах. Также можно получить численные значения констант. Лексическим сканером не так уж и много можно выявить ошибок, например, неправильную запись чисел, но лучше это оставить следующим анализаторам.
На втором этапе полученный псевдокод скармливается синтаксическому анализатору. Он вылавливает львиную долю ошибок - неправильное следование или пропуск ключевых слов, встреча различных литералов в неожиданных местах, не соответствующих синтаксису языка. При написании этого анализатора вам поможет теория формальных грамматик. Если грамматика языка не автоматная, то.. .
...следующим этапом будет семантический анализатор. Он выявит неправильное использование скобок, кавычек, выход за допустимые пределы значений, найдёт неинициализированные и недекларированные переменные. Все три этих анализатора могут быть совмещены или частично включаться друг в друга. Выяснять размер выделяемой под переменные память может как синтаксический, так и семантический анализатор.
Далее для более удобной компиляции следует преобразовать уже проверенный псевдокод в ПолИЗ (постфиксную запись) , хотя это и не обязательно, но структура программы будет ближе к программе на машинном коде для непосредственного выполнения процессором.
Затем можно приступить к компиляции либо сразу в машинный код, либо в текстовый файл (как препроцессор для ассемблерного компилятора) . Самый простой способ - иметь откомпилированные (но не слинкованные) объектные файлы или текстовые файлы inc с реализацией операторов и функций языка.
Тогда вам останется передавать значения переменных и констант в стек или загружать в регистры и вызывать соответствующие подпрограммы инструкцией call.
Осталось откомпилировать и слинковать полученные исходники внешним транслятором ассемблера и вы получите экзешник введённой программы.
Разумеется, можно не компилировать программу, а реализовать операции языка средствами паскаля (т. к. в вашем случае используется Lazarus), но это уже будет интерпретатор и автономно запустить программу не удастся.
P.S. Про оптимизацию кода не упоминаю, так как для ваших целей это вряд ли понадобится.
Похожие вопросы
- Почему компиляция веб-проекта в браузере проходит легче чем компиляция десктопного проекта в среде? (объяснения внутри)
- Помогите сделать программкупо возможности в basic ну или pascal (lazarus, delphy)
- Как создать *.exe файл? (описание внутри)
- Компиляция в Borland c++
- Возможно ли обратная компиляция? Теоретически. Вернуть любую программу в исходники.
- Как создали программу для компиляции приложения без компилятора.
- Проблема с explorer.exe ,че делать?? происхоодит при открытие определенных папок проводником?
- winlogon.exe грузит процессор!!
- Assembler помогите создать файлы *.obj *.exe
- Как создать файл .exe, который запустит любой другой файл (В том числе и .exe)? !Прочитайте пояснения в вопросе!