Найти - Пользователи
Полная версия: Как создать синтаксический анализатор кода?
Начало » Центр помощи » Как создать синтаксический анализатор кода?
1 2 3 4
dmitriyLutsenko
Доброго времени суток.

Я выполняю курсовую работу по проектированию транслятора кода (Перевод кода Паскаль в аналогичный код на С++).
Этапы анализа делятся на
  1. Лексический анализ: проводится парсинг кода Паскаль на токены.
    То есть код
    program test; 
    begin
    writeln('123');
    end.
    будет преобразован к массиву/списку токенов
     tokens = [['Lx_PR', 'program'], ['Lx_ID', 'test'], ['Lx_SMCLN', ';'], ['Lx_BGN', 'begin'], ['Lx_WRT', 'writeln'], ['Lx_LBR', '('], ['Lx_STR', '\'123\''], ['Lx_RBR', ')'], ['Lx_SMCLN', ';'], ['Lx_END', 'end'], ['Lx_DOT', '.']]
    
  2. Синтаксический анализ - необходимо представить список токенов к дереву(AST, дерево абстрактного синтаксиса) - Вот здесь я испытываю затруднение с написанием алгоритма.
Поэтому возник вопрос:
- Какой подход необходимо применить при написании абстрактного синтаксического дерева? Хотя бы на том списке токенов, который я привел?

Я бы с удовольствием использовал библиотеку PyPY (Lex - Yacc), но в требованиях к курсовой указано не использовать готовый функционал.
FishHook

Если вбить в гугл “абстрактное синтаксическое дерево” то он выдаст примерно килотонну статей, учебников, и примеров на тему, как построить AST. Вы думаете, что кто-то вам сейчас в двух словах объяснит лучше, чем это написано в учебнике?
dmitriyLutsenko
FishHook
Если вбить в гугл “абстрактное синтаксическое дерево” то он выдаст примерно килотонну статей, учебников, и примеров на тему, как построить AST. Вы думаете, что кто-то вам сейчас в двух словах объяснит лучше, чем это написано в учебнике?
В чем Ваша проблема? Что за пассивная агрессия? Может, у Вас нет опыта написания проектов схожей тематики, но за других -то не надо говорить.
py.user.next
dmitriyLutsenko
Я бы с удовольствием использовал библиотеку PyPY (Lex - Yacc)
Это не помогло бы тебе вообще никак.

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

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

dmitriyLutsenko
Лексический анализ: проводится парсинг кода Паскаль на токены.
Да это самое простое во всей этой истории. Теперь для токенов надо построить систему правил языка правильных цепочек этих токенов. Правильная цепочка принадлежит языку. Неправильная цепочка не принадлежит языку. Языком называется множество всех правильных цепочек.

Изучал вообще хоть что-нибудь из этого?
dmitriyLutsenko
py.user.next
Изучал вообще хоть что-нибудь из этого?
только раз в качестве лабораторной работы теории автоматов писал перевод цикла for в while (Автомат Мура). И то, работал не очень Но это было очень давно и писал на java.
с формальными языками я познакомился еще с теории автоматов.


py.user.next
Думаю, тебе может понадобиться детерминированный конечный автомат с магазинной памятью для всего этого.
Что же, значит, освежу память и реализую ДКА, хотя там переходов будет будь здоров.

Заодно скину то, над чем работаю.
С питоном я на вежливом “Вы”, и кое-какой функционал бы отрефакторить. Но в целом лексический анализатор работает.


py.user.next
dmitriyLutsenko
Заодно скину то, над чем работаю.
Как ты отличишь точку в вещественном числе от точки в конце программы? Как ты отличишь плюс между числами от плюса между строками? Лексемы из лексического анализатора будут приходить одни и те же. Нужны правила.

dmitriyLutsenko
Что же, значит, освежу память и реализую ДКА
Да не реализуешь ты ничего.

dmitriyLutsenko
Заодно скину то, над чем работаю.
Прикреплённый файлы:
attachment SysProgSoft.zip (18,8 KБ)
С чего ты взял, что класс должен что-то на экран выводить? Это не только для питона уровень новичка, но и вообще для любого другого языка.

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

dmitriyLutsenko
Я бы с удовольствием использовал библиотеку PyPY (Lex - Yacc)
Ты просто не знаешь, что в Yacc точно так же надо сначала разработать систему правил самому, а потом уже на нём эти правила записывать. А если ты эти правила не разработал, то и записывать на нём будет нечего.
dmitriyLutsenko
py.user.next
Да не реализуешь ты ничего.
И что я, по твоему, должен на это ответить?

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

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

Есть что добавить? Может, тебе просто хочется выговориться? Но не оффтопь только и без прямых/косвенных оскорблений.




dmitriyLutsenko
Короче, ребят, если не хотите помочь, просто игнорьте тему.

А то писать простыни текста, в котором указано, какой я рукозадый - просто трата времени.
Питоном на жизнь я не зарабатываю, а просто делаю свои учебные дела.
py.user.next
dmitriyLutsenko
И что я, по твоему, должен на это ответить?
Ничего не отвечай, попробуй реализуй это. Можно реализовывать через Yacc, как ты говорил в начале, я разрешаю, со мной ты можешь быть полностью свободен в своём выборе. Когда ты это не реализуешь и через Yacc в том числе, ты придёшь сюда и тебе будут помогать, может быть.

dmitriyLutsenko
Код у меня г…но
У тебя код даже юнит-тестами не покрыт. О каком качестве ты говоришь? Если я его сейчас покрою юнит-тестами, они тут же вскроют 100500 ошибок, которые потом ещё и исправлять за тебя надо будет, потому что сам ты будешь рассказывать нам всем тут, как ты можешь эти ошибки исправить и как учился в каком-то там году их исправлять. Зачем мне время на это тратить? Ну, не могёшь ты, не могёшь. Об этом я и говорю. Кришнаит такой, с розовыми соплями, одной ногой в канализационном люке, жрёт с помойки и со столиков в Макдональдсе тайком, где люди не доели еду и оставили крошку-картошку, но при этом счастлив и всем говорит “да вы ничего не понимаете просто! а я-то понимаю как раз! я счастье напрямую черпаю из космоса! а вы дураки все! ха-ха-ха-хари-хари-рама!”.

dmitriyLutsenko
А то писать простыни текста
Это не простыни текста, я их пишу за три минуты все, потому что когда-то давно, в 2002 году, уделил этому кучу времени и научился набирать вслепую и десятью пальцами, так как мне это надо было для дела. Компьютерный человек всегда всё подбирает под своё дело.

dmitriyLutsenko
Есть что добавить?
Напиши транслятор, который хотя бы пустую программу на одном языке в пустую программу на другом языке транслирует. Начни с этого. Это такой Hello World в компиляции.
FishHook
py.user.next
таблетку забыл выпить?


py.user.next
Напиши транслятор, который хотя бы пустую программу на одном языке в пустую программу на другом языке транслирует. Начни с этого. Это такой Hello World в компиляции.

как это мило

dmitriyLutsenko
Я выполняю курсовую работу по проектированию транслятора кода (Перевод кода Паскаль в аналогичный код на С++).

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB