Changes between Initial Version and Version 1 of RfpParserInJavaCC


Ignore:
Timestamp:
Oct 22, 2006, 5:05:25 PM (14 years ago)
Author:
roman
Comment:

Лексер и парсер для Рефала+, сделанные через JavaCC

Legend:

Unmodified
Added
Removed
Modified
  • RfpParserInJavaCC

    v1 v1  
     1= Лексер и парсер для Рефала+, сделанные через JavaCC =
     2
     3  source:devel-tools/trunk/eclipse/org.refal.plus.javacc
     4
     5  https://javacc.dev.java.net/
     6
     7  http://eclipse-javacc.sourceforge.net/
     8
     9== Зачем нужны лексер и парсер для Рефала+? ==
     10
     11Для интерактивной работы с разработчиком, нужно иметь программу
     12в проанализированном виде (в абстрактном синтаксисе). Предполагаются
     13такие виды помощи разработчику:
     14
     15 * Раскраска синтаксиса с учетом контекстных зависимостей. Например,
     16   могут краситься разным цветом главные вхождения переменной (где определяется
     17   ее значение) и повторными вхождениями (где ее значение используется).
     18
     19 * Показ синтаксических и семантических ошибок.
     20
     21 * Рефакторизация (преобразования программы без изменения ее смысла).
     22 
     23Для реализации таких возможностей, недостаточно иметь компилятор, который
     24устроен как "черный ящик" (на входе - программа, на выходе - результат
     25компиляции).
     26
     27=== Преимущества Antlr перед JavaCC ===
     28
     29 * JavaCC генерирует только Java-программы, а Antlr - программы на
     30   разных языках (в частности Java с C#). Теоретически это позволяет
     31   использовать одну и ту же грамматику для версий одного и того же
     32   компилятора на разных языках.
     33
     34Однако, возможность использовать одну и ту же грамматику в разных
     35средах - иллюзорна, ибо в грамматику обычно приходится вставлять
     36куски на каком-то языке программирования, которые зависят от этого
     37языка.
     38
     39Кроме того, грамматика по размеру составляет незначительную часть всего
     40компилятора. Недолго ее и переделать под другой CC.
     41
     42=== Преимущества JavaCC перед Antlt ===
     43
     44 * Вопрос, в значительной мере, субъективный, но создается впечатление,
     45   что в Antlr есть некоторая "расхристанность", а JavaCC сдалан как-то поаккуратней,
     46   что ли. Система понятий у JavaCC выглядит стройнее.
     47
     48 * В JavaCC грамматика превращается в определения нескольких Java-классов,
     49   которые в программу и вставляются. Т.е., в отличие от Antlr, не требуется
     50   таскать за программой дополнительную библиотеку периода исполнения.
     51
     52== Запуск лексера и парсера ==
     53
     54Лексер и парсер предполагается вставлять в плагины для Eclipse и (может быть)
     55!NetBeans. Но, для проверки грамматики, их можно запускать и отдельно.
     56
     57Для компиляции проекта под Эклипсом нужно предварительно установить JavaCC-плагин:
     58
     59  http://eclipse-javacc.sourceforge.net/
     60
     61После этого можно скомпилировать проект.
     62
     63Далее есть два способа запуска лексера и парсера: в качестве консольного
     64приложения или через JUnit.
     65
     66=== Запуск в качестве консольного приложения ===
     67
     68Запускаем как консольное приложение через функцию
     69
     70  '''org.refal.plus.test.Main.main'''
     71
     72После этого вводим через '''System.in''' реализацию Рефал-модуля
     73(т.е. то, что обычно находится в rf-файле).
     74
     75=== Запуск через JUnit ===
     76
     77В классе
     78
     79  '''org.refal.plus.test.RfpStringParserTest'''
     80
     81определены две функции
     82
     83  '''testParseModuleInterface'''[[BR]]
     84  '''testParseModuleImplementation'''
     85
     86которые запускают набор тестов для проверки лексера и парсера. Функция
     87'''testParseModuleInterface''' применяет лексер и парсер к "интерфейсам" модулей
     88(обычно находящимся в rfi-файлах), а '''testParseModuleInterface''' применяет
     89лексер и парсер к "реализациям" модулей (обычно находящимся в rf-файлах).