Skip to content

Commit 1b38317

Browse files
authored
Рефакторинг парсера описаний (#349)
* переложил классы по пакетам * подтянул фиксы из разных мест * 1. переименован лексер 2. call options объеден с examples 3. упрощен основной блок парсинга 4. subparamter переименован в field (и все связанное) 5. оптимизация создания описания метода и переменной * гиперссылки сделаны объектами, описание содержит список всех гиперссылок * оптимизация чтения примеров * промежуточный вариант чтения параметров * оптимизация парсинга возвр значения * вычисление типов * начало оптимизации читателей * рефакторинг хранения типов и параметров * sq fixes * sq fixes * явно указан приватный конструктор * 1. Добавлено хранение расположения элементов описания в тексте 2. токенайзер описаний сделан приватным * sq fixes * вернул возможность указать варианты вызова в описании метода. добавлено несколько наиболее логичных варианта * sq fixes * sq fixes
1 parent 128bcd9 commit 1b38317

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+3117
-1927
lines changed

build.gradle.kts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ plugins {
1111
id("me.qoomon.git-versioning") version "6.4.4"
1212
id("io.freefair.javadoc-links") version "9.1.0"
1313
id("io.freefair.javadoc-utf-8") version "9.1.0"
14+
id("io.freefair.lombok") version "9.1.0"
1415
id("io.freefair.maven-central.validate-poms") version "9.1.0"
1516
id("com.github.ben-manes.versions") version "0.53.0"
1617
id("ru.vyarus.pom") version "3.0.0"
@@ -96,6 +97,14 @@ tasks.named<org.gradle.jvm.tasks.Jar>("sourcesJar") {
9697
dependsOn(tasks.generateGrammarSource)
9798
}
9899

100+
tasks.named("delombok") {
101+
enabled = false
102+
}
103+
104+
tasks.maybeCreate("delombokTest").apply {
105+
enabled = false
106+
}
107+
99108
tasks.processTestResources {
100109
duplicatesStrategy = DuplicatesStrategy.INCLUDE
101110
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/**
2+
* This file is a part of BSL Parser.
3+
*
4+
* Copyright © 2018-2026
5+
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com>, Sergey Batanov <sergey.batanov@dmpas.ru>
6+
*
7+
* SPDX-License-Identifier: LGPL-3.0-or-later
8+
*
9+
* BSL Parser is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU Lesser General Public
11+
* License as published by the Free Software Foundation; either
12+
* version 3.0 of the License, or (at your option) any later version.
13+
*
14+
* BSL Parser is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
* Lesser General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Lesser General Public
20+
* License along with BSL Parser.
21+
*/
22+
/**
23+
* @author Maximov Valery <maximovvalery@gmail.com>
24+
*/
25+
lexer grammar BSLDescriptionLexer;
26+
27+
options { caseInsensitive=true; }
28+
29+
// KEYWORDS
30+
PARAMETERS_KEYWORD: 'PARAMETERS:' | 'ПАРАМЕТРЫ:';
31+
RETURNS_KEYWORD: 'RETURNS:' | 'ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:';
32+
EXAMPLE_KEYWORD: 'EXAMPLE:' | 'EXAMPLES:' | 'ПРИМЕР:' | 'ПРИМЕРЫ:';
33+
CALL_OPTIONS_KEYWORD: 'CALL OPTIONS:' | 'ВАРИАНТЫ ВЫЗОВА:';
34+
DEPRECATE_KEYWORD: 'DEPRECATE' | 'DEPRECATE.' | 'УСТАРЕЛА' | 'УСТАРЕЛА.';
35+
SEE_KEYWORD: 'SEE' | 'СМ.';
36+
OF_KEYWORD: 'OF' | 'CONTAINS' | 'ИЗ';
37+
38+
// COMMON
39+
EOL : '\r'? '\n';
40+
SPACE : [ \t]+;
41+
STAR : '*'+;
42+
DASH : [-–];
43+
COLON : ':';
44+
COMMA : ',';
45+
// OTHER
46+
COMMENT : '//';
47+
WORD : LETTER (LETTER | DIGIT)*;
48+
DOTSWORD: WORD ('.' WORD)+;
49+
LPAREN : '(';
50+
RPAREN : ')';
51+
52+
ANYSYMBOL: .;
53+
54+
// LITERALS
55+
fragment DIGIT: [0-9];
56+
fragment LETTER: [\p{Letter}] | '_';
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
/**
2+
* This file is a part of BSL Parser.
3+
*
4+
* Copyright © 2018-2026
5+
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com>, Sergey Batanov <sergey.batanov@dmpas.ru>
6+
*
7+
* SPDX-License-Identifier: LGPL-3.0-or-later
8+
*
9+
* BSL Parser is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU Lesser General Public
11+
* License as published by the Free Software Foundation; either
12+
* version 3.0 of the License, or (at your option) any later version.
13+
*
14+
* BSL Parser is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
* Lesser General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Lesser General Public
20+
* License along with BSL Parser.
21+
*/
22+
/**
23+
* @author Maximov Valery <maximovvalery@gmail.com>
24+
*/
25+
parser grammar BSLDescriptionParser;
26+
27+
options {
28+
tokenVocab = BSLDescriptionLexer;
29+
}
30+
31+
// структура описания
32+
methodDescription:
33+
(
34+
(deprecateBlock? descriptionBlock? parametersBlock? returnsValuesBlock? callOptionsBlock? examplesBlock?)
35+
| (deprecateBlock? descriptionBlock? parametersBlock? returnsValuesBlock? examplesBlock? callOptionsBlock?)
36+
| (descriptionBlock? parametersBlock? returnsValuesBlock? callOptionsBlock? examplesBlock? deprecateBlock?)
37+
| (descriptionBlock? parametersBlock? returnsValuesBlock? examplesBlock? callOptionsBlock? deprecateBlock?)
38+
) EOF;
39+
40+
// deprecate
41+
deprecateBlock: startPart DEPRECATE_KEYWORD (deprecateDescription | EOL);
42+
deprecateDescription: (hyperlink | ~(EOL | EOF))+ EOL;
43+
44+
// description
45+
descriptionBlock: descriptionString+;
46+
descriptionString:
47+
(startPart
48+
// гиперссылка или не ключевое (ну и не конец строки)
49+
(hyperlink | ~(PARAMETERS_KEYWORD | CALL_OPTIONS_KEYWORD | RETURNS_KEYWORD | EXAMPLE_KEYWORD | DEPRECATE_KEYWORD | EOL | EOF | SPACE))
50+
(hyperlink | ~(EOL | EOF))* // любой
51+
EOL)
52+
| (startPart EOL)
53+
;
54+
55+
// examples
56+
examplesBlock: examplesHead examplesStrings=examplesString*;
57+
examplesHead: startPart EXAMPLE_KEYWORD SPACE? EOL;
58+
examplesString:
59+
(startPart
60+
// гиперссылка или не ключевое (ну и не конец строки)
61+
(hyperlink | ~(DEPRECATE_KEYWORD | CALL_OPTIONS_KEYWORD | EOL | EOF | SPACE))
62+
(hyperlink | ~(EOL | EOF))* // любой
63+
EOL)
64+
| (startPart EOL)
65+
;
66+
67+
// callOptions
68+
callOptionsBlock: callOptionsHead callOptionsStrings=callOptionsString*;
69+
callOptionsHead: startPart CALL_OPTIONS_KEYWORD SPACE? EOL;
70+
callOptionsString:
71+
(startPart
72+
// гиперссылка или не ключевое (ну и не конец строки)
73+
(hyperlink | ~(DEPRECATE_KEYWORD | EXAMPLE_KEYWORD | EOL | EOF | SPACE))
74+
(hyperlink | ~(EOL | EOF))* // любой
75+
EOL)
76+
| (startPart EOL)
77+
;
78+
79+
// parameters
80+
parametersBlock: parametersHead parameterStrings=parameterString*;
81+
parametersHead: startPart PARAMETERS_KEYWORD SPACE? EOL;
82+
parameterString:
83+
(startPart parameter)
84+
| (startPart field)
85+
| (startPart typesBlock)
86+
| (startPart typeDescription)
87+
;
88+
89+
parameter: parameterName typesBlock;
90+
field: level=STAR SPACE? parameterName typesBlock;
91+
parameterName: WORD;
92+
93+
// returnsValues
94+
returnsValuesBlock: returnsValuesHead returnsValuesStrings=returnsValuesString*;
95+
returnsValuesHead: startPart RETURNS_KEYWORD SPACE? EOL;
96+
returnsValuesString:
97+
(startPart returnsValue)
98+
| (startPart typesBlock)
99+
| (startPart field)
100+
| (startPart typeDescription)
101+
;
102+
103+
returnsValue: type
104+
(
105+
(splitter typeDescription)
106+
| (splitter EOL)
107+
| EOL
108+
)
109+
;
110+
111+
typeDescription:
112+
(
113+
(hyperlink | first=~(RETURNS_KEYWORD | EXAMPLE_KEYWORD | CALL_OPTIONS_KEYWORD | DEPRECATE_KEYWORD | EOL | EOF | SPACE))
114+
(hyperlink | second=~(EOL | EOF))*
115+
EOL
116+
)
117+
| (SPACE* EOL)
118+
;
119+
120+
typesBlock: splitter type
121+
(
122+
(splitter typeDescription)
123+
| (splitter EOL)
124+
| EOL
125+
)
126+
;
127+
128+
type: listTypes | collectionType | hyperlinkType | simpleType;
129+
simpleType: typeName=(WORD | DOTSWORD) colon=COLON?;
130+
collectionType: collection=(WORD | DOTSWORD) SPACE OF_KEYWORD SPACE value=type;
131+
hyperlinkType: hyperlink;
132+
listTypes: listType (COMMA SPACE? listType)+;
133+
listType: simpleType | collectionType | hyperlinkType;
134+
135+
hyperlink: SEE_KEYWORD SPACE link=(WORD | DOTSWORD) (LPAREN linkParams=~EOL* RPAREN)?;
136+
splitter: SPACE? DASH SPACE?;
137+
startPart: SPACE? COMMENT SPACE?;

src/main/antlr/BSLLexer.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* This file is a part of BSL Parser.
33
*
4-
* Copyright © 2018-2022
4+
* Copyright © 2018-2026
55
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com>, Sergey Batanov <sergey.batanov@dmpas.ru>
66
*
77
* SPDX-License-Identifier: LGPL-3.0-or-later

src/main/antlr/BSLMethodDescriptionLexer.g4

Lines changed: 0 additions & 114 deletions
This file was deleted.

0 commit comments

Comments
 (0)