При разработке сложных программных систем существует проблема недостат¬ка выразительности и гибкости языков программирования общего назначения. Ча¬сто для решения данной проблемы помимо основного языка используют один или несколько других (встроенных) языков. В данном подходе программа, написанная на основном языке, динамически формирует строковое представление кода на встро¬енном языке, и далее сформированная строка анализируется и выполняется специ¬альными компонентами (базы данных, веб-браузер) во время исполнения основной программы.
Как правило, динамически формируемые выражения, описывающие код программ на встроенных языках, конструируются с использованием конкатенаций строковых литералов в ветках условных операторов, циклах и рекурсивных процедурах. Это при-водит к множеству возможных значений встроенного кода, что не позволяет в общем виде использовать статический анализ для проверки корректности формируемого вы¬ражения. В результате этого становятся недоступными такие типы функционально¬сти, как информирование о синтаксических ошибках, автодополнение и подсветка синтаксиса. Отсутствие этих возможностей повышает вероятность ошибок, которые обнаруживаются лишь во время выполнения программы, а также усложняет процесс разработки и тестирования.
Существует ряд инструментов, позволяющих проводить анализ динамически фор-мируемых строковых выражений: Java String Analyzer [5, 9], PHP String Analyzer [12], Alvor [8, 2, 1], IntelliLang [7], PHPStorm [14], Varis [13] (анализ этих технологий приве¬ден в работе [21]). Большинство реализаций проводят диагностику синтаксических ошибок, но плохо расширяемы: как в смысле поддержки других языков, так и в смысле решения новых задач. Существует алгоритм, описанный в статье [19] и ре¬ализованный как часть проекта YaccConstructor [11], который позволяет провести синтаксический анализ динамически формируемых выражений. В отличие от других инструментов, реализация данного алгоритма хорошо расширяема и строит конечное представление леса разбора относительно входной грамматики, которое может быть использовано в дальнейшем семантическом анализе. Недостаток данного алгоритма заключается в отсутствии механизма диагностики синтаксических ошибок. Устране¬нию этого недостатка и посвящена данная работа.
В ходе данной работы получены следующие результаты.
• Определено понятие синтаксической ошибки в терминах регулярной аппрокси¬мации динамически формируемого выражения.
• Разработан механизм диагностики ошибок в синтаксическом анализе регулярной аппроксимации динамически формируемого выражения.
• Доказана корректность предложенного механизма.
• Предложенный механизм реализован на языке программирования F# в рамках проекта YaccConstructor.
• Проведено экспериментальное исследование: тестирование работоспособности и тестирование производительности.
• Исходный код проекта YaccConstructor можно найти на сайте https://github. com/YaccConstructor/YaccConstructor, автор принимал участие под учётной записью rustam-azimov.
В дальнейшем планируется использовать результат работы модифицированного алгоритма синтаксического анализа для формирования сообщений об обнаруженных ошибках, удобных для пользователя. Кроме того, необходимо произвести теоретиче¬скую оценку сложности модифицированного алгоритма.
[1] Alvor [Электронный ресурс].— URL: https://bitbucket.org/plas/alvor (дата обращения: 18.05.2016).
[2] Annamaa A., Breslav A., Vene V. Using Abstract Lexical Analysis and Parsing to Detect Errors in String-Embedded DSL Statements // Proceedings of the 22nd Nordic Workshop on Programming Theory. — 2010. — P. 20-22.
[3] Asveld P. R. J., Nijholt A. The Inclusion Problem for Some Subclasses of Context- free Languages.— Vol. 230.— Essex, UK : Elsevier Science Publishers Ltd., 1999.— December. — P. 247-256.
[4] Automata-based Symbolic String Analysis for Vulnerability Detection / F. Yu, M. Alkhalaf, T. Bultan, O. H. Ibarra // Form. Methods Syst. Des. — 2014. — Vol. 44, no. 1.-P. 44-70.
[5] Christensen A. S., Mpller A., Schwartzbach M. I. Precise Analysis of String Expressions // Proc. 10th International Static Analysis Symposium (SAS). -¬Vol. 2694 of LNCS. -- Springer-Verlag, 2003. -- P. 1-18.
[6] Dick G., Ceriel H. Parsing Techniques: A Practical Guide. — Upper Saddle River, NJ, USA : Ellis Horwood, 1990.— ISBN: 0-13-651431-6.
[7] IntelliLang [Электронный ресурс].— URL: https://www.jetbrains.com/idea/ help/intellilang.html (дата обращения: 18.05.2016).
[8] An Interactive Tool for Analyzing Embedded SQL Queries / A. Annamaa, A. Breslav,
J. Kabanov, V. Vene // Proceedings of the 8th Asian Conference on Programming Languages and Systems. — APLAS’10. — Berlin, Heidelberg : Springer-Verlag, 2010. — P. 131-138.
[9] Java String Analyzer [Электронный ресурс].— URL: http://www.brics.dk/JSA/ (дата обращения: 18.05.2016).
[10] Khabibullin M., Ivanov A., Grigorev S. On Development of Static Analysis Tools for String-Embedded Languages. -- 2015. -- URL: https://github.com/ YaccConstructor/articles/blob/master/2015/SECR/paper/Main.pdf (online; accessed: 18.05.2016).
[11] Kirilenko I., Grigorev S., Avdiukhin D. Syntax Analyzers Development in Automated Reengineering of Informational System // St. Petersburg State Polytechnical University Journal. Computer Science. Telecommunications and Control Systems. -¬2013. — Vol. 174, no. 3. — P. 94-98.
[12] Minamide Y. Static Approximation of Dynamically Generated Web Pages // Proceedings of the 14th International Conference on World Wide Web. — WWW ’05. - New York, NY, USA : ACM, 2005. - P. 432-441.
[13] Nguyen H. V., Kastner C., Nguyen T. N. Varis: IDE Support for Embedded Client Code in PHP Web Applications // Proceedings of the 37th International Conference on Software Engineering (ICSE).— New York, NY : ACM Press, 2015.— Formal Demonstration paper.
[14] PHPStorm IDE [Электронный ресурс].— URL: https://www.jetbrains.com/ phpstorm/ (дата обращения: 18.05.2016).
[15] Rekers J. Parser Generation for Interactive Environments. — 1992.
[16] Scott E., Johnstone A. Right Nulled GLR Parsers // ACM Trans. Program. Lang. Syst. - 2006. - Vol. 28, no. 4. - P. 577-618.
[17] Syme Don, Granicz Adam, Cisternino Antonio. Expert F# (Expert’s Voice in .Net). — ISBN: 1590598504, 9781590598504.
[18] Tomita M. An Efficient Context-free Parsing Algorithm for Natural Languages // Proceedings of the 9th International Joint Conference on Artificial Intelligence - Volume 2.— IJCAI’85.— San Francisco, CA, USA : Morgan Kaufmann Publishers Inc., 1985. — P. 756-764.
[19] Verbitskaia E., Grigorev S., Avdyukhin D. Relaxed Parsing of Regular Approximations of String-Embedded Languages // Preliminary Proceedings of the PSI 2015: 10th International Andrei Ershov Memorial Conference. — PSI’15. — 2015. — P. 1-12.
[20] Вербицкая Е. А. Синтаксический анализ регулярных множеств : Квалификаци¬онная работа магистра / Е. А. Вербицкая ; Санкт-Петербургский государствен¬ный университет. — 2015.
[21] Григорьев C. В. Синтаксический анализ динамически формируемых программ : Дисс... кандидата наук / C. В. Григорьев ; Санкт-Петербургский государствен¬ный университет. — 2015.