Научная статья на тему 'Синтаксический анализ кода hlasm в среде разработки Intellij idea'

Синтаксический анализ кода hlasm в среде разработки Intellij idea Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
327
39
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
КОД / HLASM / СИНТАКСИЧЕСКИЙ АНАЛИЗ / INTELLIJ IDEA / ТРИПЛЕТ / ГРАММАТИКА / СИНТАКСИЧЕСКОЕ ДЕРЕВО / ЛЕКСЕР / ПАРСЕР / JAVA / ANTLR / CODE / SYNTAX ANALYS / TRIPLET / GRAMMAR / SYNTAX TREE / PARSER

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Хасанов К.А., Каракозов В.И.

Рассматриваются решения по синтаксическому разбору кода на языке HLASM с последующей подсветкой синтаксиса, применяемой в среде разработки Intellij IDEA для повышения эффективности работы программиста. При анализе этой части кода можно выделить общий модуль, в котором объявлены инструкции, в которых имеются некоторые параметры. Модуль нужно отразить в виде формализованной модели, которая показывает типы, значения, вложенность кода и сами сущности. Для этого используется синтаксическое дерево. Семантическая модель кода и дерево разбора строятся с помощью лексического анализатора и парсер, которые понимают грамматику выбранного языка программирования, проходя от вершины к конечным операндам. Описывается характеристика программной реализации. Приводится схема иерархии правил. Предложенное решение позволяет повысить удобство процесса написания кода.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Хасанов К.А., Каракозов В.И.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Syntax Parsing for HLASM Language in the Development Environment Intellij IDEA

Considering solutions for parsing code in the HLASM programming language with syntax highlighting, that used in the development environment Intellij IDEA to improve the efficiency of the programmer. When analyzing this part of code, the main we can identify a main module that declares statements that have some parameters. The module needs to be reflected in the form of a formalized model which shows the types, values, nesting of the code and the entities. The syntax tree is used for this purpose. The semantic code model and parsing tree are built with the help of a lexical analyzer and parser that understand the grammar of the selected programming language, passing from the top to the final operands. The characteristic of software implementation is described. The scheme of the rule hierarchy is given. The proposed solution improves the convenience of the code writing process.

Текст научной работы на тему «Синтаксический анализ кода hlasm в среде разработки Intellij idea»

Синтаксический анализ кода HLASM в среде разработки Intellij IDEA

студент магистратуры К. А. Хасанов, студент магистратуры В.И. Каракозов Петербургский государственный университет путей сообщения Императора Александра I

Санкт-Петербург, Россия hasanow.kamil@yandex.ru

Аннотация. Рассматриваются решения по синтаксическому разбору кода на языке HLASM с последующей подсветкой синтаксиса, применяемой в среде разработки Intellij IDEA для повышения эффективности работы программиста. При анализе этой части кода можно выделить общий модуль, в котором объявлены инструкции, в которых имеются некоторые параметры. Модуль нужно отразить в виде формализованной модели, которая показывает типы, значения, вложенность кода и сами сущности. Для этого используется синтаксическое дерево. Семантическая модель кода и дерево разбора строятся с помощью лексического анализатора и парсера, которые понимают грамматику выбранного языка программирования, проходя от вершины к конечным операндам. Описывается характеристика программной реализации. Приводится схема иерархии правил. Предложенное решение позволяет повысить удобство процесса написания кода.

Ключевые слова: код, HLASM, синтаксический анализ, Intellij IDEA, триплет, грамматика, синтаксическое дерево, лексер, парсер, Java, ANTLR.

Введение

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

Интегрированные среды разработки дают большие преимущества для программистов, которые только начали знакомство с языком, а также повышают эффективность написания кода [1]. Любая крупная среда разработки имеет вспомогательные средства, такие как выделение структуры исходного кода, контекстно-зависимые подсказки и помощь, расцветка синтаксиса.

К сожалению, процесс разработки и внедрения поддержки новых языков программирования с использовани-

ем практически любой из существующих сред является сложной и трудоемкой задачей.

В данной работе представлена работа с Intellij IDEA SDK — инструментарием для разработки приложения, в частности, и редакторов кода. Intellij IDEA — это мульти-язычная интегрированная среда разработки программного обеспечения, таких как Python, Java, JavaScript, созданная компанией JetBrains.

На основе синтаксического анализа текста программы выполняется расцветка текста, которая предоставляется библиотекой Intellij IDEA SDK. Процесс расцветки — это выделение значимых лексем и сопоставление им визуальных атрибутов, таких как размер, шрифт, цвет. Помимо визуальных атрибутов предоставляется анализ структуры текста: рекурсивных и парных конструкций; выделение структурного дерева позволяет целевой IDE реализовать расширенную навигацию по тексту.

Язык ассемблера высокого уровня HLASM

В качестве языка, для кода которого проводится синтаксический анализ, выбран язык ассемблера высокого уровня (High-Level Assembler, HLASM). Он представляет собой язык ассемблера высокого уровня фирмы IBM, используемый под управлением операционных систем z/Architecture на компьютерах мейнфрейм. Компьютер такого типа представляет собой большой отказоустойчивый высокопроизводительный универсальный сервер со значительными ресурсами ввода-вывода, большим объемом внешней и оперативной памяти, предназначенный для использования в критически важных системах с интенсивной пакетной и оперативной транзакционной обработкой.

Основанный на ассемблере IBM H, он позволяет программистам писать на ассемблере код, который использует ряд особенностей, связанных с языками высокого уровня. Например, наличие директив, зависимых и отмеченных от USING, более полная перекрестно-ссылочная информация, а также дополнительные макроязыковые средства (например, для разработки пользовательских функций) [2].

В операционных системах z/Architecture имеется редактор ISPF (Interactive System Productivity Facility), внешний вид которого представлен на рисунке 1. Этот редактор имеет лишь базовую подсветку синтаксиса.

Vista Session А ■31331

I Fite Edit Foot Transfer Macro Options Window Help 1

Dei 1® Ш Ш t ÜD 0 EIh 3> 4> s> *► I " "¿1 [*T*I \m& m Id

File Edit ;onfirni Menu Uti I i ties Conpi ler's Test Help

EDIT U5ERIB.TOM.flSM(RPPCIM) - 01.17 Columns 00001 00072

Command ===> Scroll ===> CSR

***** ***************************** Top of Data ******************************

000100 //APPCIM JOB (TE0OTBREHM,DK4D),T.BREMHflM,tlOTIFV=USERIO,

000200 // TIME=(,1S),M5GCLASS=A,,MSGLEVEL=(1,1),COHD=C0,NE)

000300 /#XEQ TECDfi

000400 /»ROUTE PRINT HOLD0

000500 //*

0 00600 / /3(t)|f 3(C3|E5|C3|t3(E3(r3(C3(C3(tl(t)|t3|Ci|E JfCD^C3§C^fC39C3#C3fC3#C^CHCHC5#C3fC3ft3(t3#C3#C

000700 //* ASSEMBLE AND LINK APPCItl

000800 //*********************************************************************

000900 //*

001000 //ASH ASMHCL,PARM,ASM='OBJECT,MODECK,XREFtSHORT),TEST

001100 // PARM.LKED='LIST, LET ,XREF,, TEST'

001200 //ASM,SYSLIB DSH=5YSI.MACLIB,OISP=SHR

001300 // DO DSN=SYS1.AM0DGEM,DISP=SHR

001-100 //ASM.SYSPRIHT DD SYSOUT=*,DCB=BUFH0=1

001500 //ASM.SYSIM DO *

001600 YREGS

OQ17O0 LAST EQU X'BOOODOOO-

O01BO0 APPCIM CSECT

001900 APPCIM AMODE 31

0.0 02/01/03.032 02:13PM tn3270.company.con

а 24/1б|

Рис. 1. Редактор ISPF

В настоящее время не существует сред разработки с поддержкой языка HLASM. Поэтому создание программного продукта, который будет разбирать код HLASM и подсвечивать его, а также дальнейшее расширение функционала с помощью средств Intellij IDEA SDK позволит облегчить процесс написания кода для программистов.

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

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

Любой язык программирования можно описать набором правил, которые выделяют некоторое подмножество известных символов из множества слов конечного алфавита языка. Данный набор правил называется грамматикой языка, которая задает правила, определяющие правильность построения слова языка, и позволяет построить любое новое слово языка. Первые являются распознающими, или аналитическими, грамматиками, вторые являются порождающими [3].

Код, написанный на HLASM, будучи правильно оформленным, представляет собой последовательность инструкций. Соблюдая правила именования сущностей в коде и его правильной структуры, можно получить объектную модель, которая отражает организацию кода. В

программе каждый объект можно рассматривать атомарно, не вдаваясь в подробности его реализации — с использованием абстрагирования. Также любой объект может являться подмножеством других объектов, которые можно рассматривать как конечную атомарную сущность. Элементарные типы, включающиеся в объект помимо других, всегда являются конечными и не могут инкапсулировать в себе что-либо. Каждый объект имеет связь с другими, например, имеет некую вложенность в другой объект.

Рассмотрим следующий пример кода:

LA LA AR

R2,3 R3,5 R2,R3

Эта часть кода записывает значение 3 и 5 в регистры И2 и Я3 соответственно. Затем складывает значение этих регистров, сохраняя получившееся в Я2.

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

Рис. 2. Дерево разбора кода

Таким образом, при синтаксическом анализе кода можно получить иерархию и элементарных типов, и объектов, а также провести связи и зависимости между ними. Такую иерархию представляет абстрактное синтаксическое дерево (АСД), или Abstract Syntax Tree (AST), ветви которого представляют объекты в коде, а листья — элементарные типы, представленные в коде. Абстрактное синтаксическое дерево — это конечное, помеченное, ориентированное дерево, листья которого сопоставлены с соответствующими операндами, а вершины — с операторами языка программирования. Отсюда следует, что листья представляют только константы и переменные, а также являются лишь пустыми операторами. Количество ветвей, как и количество листьев, может быть любым, однако дерево всегда состоит из одной вершины — объекта, который представляет программу целиком.

В абстрактном синтаксическом дереве элементы могут не определяться конкретной грамматикой разбираемого языка. Классическим примером являются ограничительные скобки в языковых конструкциях — группировка операндов в АСД явно задается структурой дерева, а ограничивающие скобки вообще отсутствуют в разборе, так как не влияют на АСД. Большое количество правил грамматики создают вершину, а символы в правиле становятся ребрами. Правила могут ничего не привносить в АСД. Примером могут служить группирующие, которые просто заменяются в вершине одним из своих символов. Также анализатор может создать полное дерево разбора, а после пройти по нему, попутно удаляя узлы и ребра, не использующиеся в абстрактном синтаксисе, чтобы получить АСД [4].

Решение задачи синтаксического анализа

Построить семантическую модель кода и дерево разбора должны лексический анализатор и парсер, которые понимают грамматику выбранного языка программирования, проходя от вершины к конечным операндам. Лексический анализатор определяет, как содержимое файла будет разбито на последовательность токенов, т. е. нетерминальных символов языка программирования. К примеру, токенами языка Java для полной грамматики языка будут являться блок кода, блок комментариев, метод, класс. Лексический анализатор служит фундаментом почти для всех функций языковых сред, таких как подсветка синтаксиса, функции анализа кода и другие. API лексического анализатора для Intellij IDEA SDK определен в интерфейсе Lexer, а для парсера — в интерфейсе Parser.

IDEA вызывает лексический анализатор в трех основных контекстах:

- подсветка синтаксиса;

- построение абстрактного синтаксического дерева;

- построение индекса слов, которые содержатся в файле, — если используется реализация сканера, основанная на пользовательском лексическом анализаторе.

Лексический анализатор для языка HLASM должен выделять в коде следующие сущности, описывающиеся лексическими правилами или грамматикой:

- директивы;

- инструкции;

- макросы;

- метки;

- комментарии;

- числа;

- простые символы;

- различные атрибуты любой из перечисленных сущностей.

Парсер — это программный модуль, основывающийся на поступающих из потока лексического анализатора то-кенах, который по заданным правилам строит абстрактное дерево разбора. Ввиду того, что исходный код языка HLASM состоит из последовательности инструкций, директив и макрокоманд, весь исходный код можно разбить на отдельные блоки, состоящие из полного описания макроса или отдельных инструкций и директив. Они, свою очередь, состоят из метки, названия команды и аргументов. Аргументы разделяются запятыми и состоят из токе-нов или комбинации токенов.

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

Одним из подобных программных средств является Another Tool for Language Recognition (ANTLR). ANTLR — это генератор лексических анализаторов и парсеров на языке Java, принимающий на вход файл с исходным кодом разбираемой программы, а на выходе создающий абстрактное синтаксическое дерево.

Определимся с набором правил. Так как исходный код

языка HLASM состоит из последовательности инструкций, то обозначим корневой элемент, или линии (lines), который состоит из одного или более заявлений (statement). Каждое заявление, в свою очередь, состоит из макроса (macro) или целой линии (line_wrapper).

Целая линия раскрывается в последовательность, которая состоит из метки по умолчанию (label_def), линии (line) и окончания целой линии (endline). Причем линии и метки по умолчанию может и не быть. Метка по умолчанию является конечным элементом.

Линия состоит из команды (commands) и директивы (directive), которые являются конечными элементами, а также аргументов (arguments). Аргументы разделены между собой конечным символом ','.

Аргумент может быть именованным аргументом (named_argument) или некоторым значением (expression). Значение является токеном или комбинацией токенов. Именованный аргумент состоит из последовательности метки (label), знака '=' и значения.

Макрос состоит из последовательности: 'MACRO', аргументы, окончание строки, описание макроса (macro_def_wr), линии, метка по умолчанию, 'MEND', аргументы, окончание строки.

Описание макроса включает в себя целую линию.

Примерная схема иерархии правил представлена на рисунке 3.

Рис. 3. Иерархия правил

Следующим этапом является подсветка синтаксиса и ошибок, которая выполняется на разных уровнях. На первом — подсветка синтаксиса, которая основана на результатах лексического разбора, осуществляется посредством интерфейса SyntaxHigЫighter. Этот интерфейс возвращает экземпляры TextAttributeKey для каждого типа токенов, который требует особую подсветку. Для подсвечивания ошибок лексического анализатора применяется стандартный объект класса TextAttributeKey для недопустимых символов (HighligherColors.BAD_CHARACTER). На втором уровне подсветки — выделение ошибок, произошед-

ших во время синтаксического разбора с определением цепочки токенов, которые не соответствуют грамматике языка [5].

Пример подсветки синтаксиса в среде разработке Intel-lij IDEA представлен на рисунке 4.

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

Zosjdea [D:\ldeaProjects\ZosJdea] - ...\TEST\RWPGM.asm [Zosjdea] - IntelliJ IDEA

File Edit View Navigate Code Analyze Ref actor Build Run Tools VCS Window Help

© Zos idea

I TEST © RWPGM.i

I~1 Add Configuration...

+J © RWPGM.asm

rhpgm pgmbegim йк=31, ei=ähy using rwpgh,r12 ia r4,0(r1j

STORAGE OBTÄIN, LENGTH= PfiRPSL, HDDR= (Rll ),LOC=2 4

using parps f rll

la. r7,skve

ST R13, 4 (R.7 \

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

strmacrd strlr str2

ST R7,S(R13|

LR R13, R7

callrtn wrrtn, ( (rl) , (r2) ) ,err=psccb l rio ,ü(r4\

callrtîï rdrtn, ( (rl) , (r2j ) ,err=ps[>£e l r6,4(r4j

using ihîl3œs, rio st r6,1_buf@

R13,4(R13)

■fc Event Log

27:29 CRLF i UTF-.

Q Event Log 4 spaces i Ъ ^

Рис. 4. Пример подсветки кода HLASM в Intellij IDEA

Заключение

В работе рассмотрены основные принципы решения задачи синтаксического анализа кода HLASM и его базовая подсветка синтаксиса, которые были реализованы в среде разработке Intellij IDEA. Эта среда разработки поддерживает большое количество функционала, который можно добавить в этот программный продукт. Предложенное решение может найти достаточно широкое применение при разработке программ на языке HLASM, позволяя повысить удобство процесса написания кода.

ЛИТЕРАТУРА

1. Thomas R.C. Long Term Human-Computer Interaction: An Exploratory Perspective. London, Springer, 1998, 212 p.

2. HLASM // Википедия. [2007-2019]. URL: http://ru.wikipedia.org/wiki/HLASM (дата обращения: 11.03.2019).

3. Context-free grammar // Wikipedia [2001-2019]. URL: http://en.wikipedia.org/wiki/Context-free_grammar (дата обращения: 11.03.2019).

4. Parr T. The Definitive ANTLR Reference: Building Domain-Specific Languages. Raleigh, Dallas, The Pragmatic Bookshelf, 2007, 384 p.

5. Подсветка синтаксиса и ошибок / Разработка плагина IntelliJ IDEA. Ч. 5 // Habr. URL: http://habr.com/ru/post/187292 (дата обращения: 11.03.2019).

Syntax Parsing for HLASM Language in the Development Environment Intellij IDEA

Graduate Student K.A. Khasanov, Graduate Student V.I. Karakozov Emperor Alexander I St. Petersburg State Transport University Saint Petersburg, Russia hasanow.kamil@yandex.ru

Abstract. Considering solutions for parsing code in the HLASM programming language with syntax highlighting, that used in the development environment Intellij IDEA to improve the efficiency of the programmer. When analyzing this part of code, the main we can identify a main module that declares statements that have some parameters. The module needs to be reflected in the form of a formalized model which shows the types, values, nesting of the code and the entities. The syntax tree is used for this purpose. The semantic code model and parsing tree are built with the help of a lexical analyzer and parser that understand the grammar of the selected programming language, passing from the top to the final operands. The characteristic of software implementation is described. The scheme of the rule hierarchy is given. The proposed solution improves the convenience of the code writing process.

Keywords: code, HLASM, syntax analys, Intellij IDEA, triplet, grammar, syntax tree, parser, Java, ANTLR.

References

1. Thomas R.C. Long Term Human-Computer Interaction: An Exploratory Perspective. London, Springer, 1998, 212 p.

2. HLASM, Wikipedia. Available at: http://ru.wikipedia.org/wiki/HLASM (accessed 11 March 2019).

3. Context-free grammar, Wikipedia. Available at: http://en.wikipedia.org/wiki/Context-free_grammar (accessed 11 March 2019).

4. Parr T. The Definitive ANTLR Reference: Building Domain-Specific Languages. Raleigh, Dallas, The Pragmatic Bookshelf, 2007, 384 p.

5. Syntax and error highlighting [Podsvetka sintaksisa i oshibok]. In: IntelliJ IDEA plugin development. Part 5 [Raz-rabotka plagina IntelliJ IDEA. Chasf 5], Habr. Available at: http://habr.com/ru/post/187292 (accessed 11 March 2019).

HHmmneKmyaxbHbie техноnогии Ha mpaHcnopme. 2019. № 2

47

i Надоели баннеры? Вы всегда можете отключить рекламу.