Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Исправлена ошибка разбор условия препроцессора #214

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/main/antlr/BSLParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,10 @@ preproc_expression
| preproc_logicalExpression
;
preproc_logicalOperand
: (PREPROC_LPAREN PREPROC_NOT_KEYWORD? preproc_logicalOperand PREPROC_RPAREN)
: (PREPROC_NOT_KEYWORD? PREPROC_LPAREN preproc_logicalOperand PREPROC_RPAREN)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мне не очень нравится вынос NOT за скобки. Может случиться неоднозначный парсинг. В старой схеме NOT стоит либо внутри скобок перед рекурсивным логическим операндом, либо перед символом препроцессора. Если оставить на первой строке старый вариант, но добавить на 54 строку необязательный NOT после LPAREN, не решится эта же проблема?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проверю, но скорее всего вообще такой вариант не используется. Раз до этого не поймали.

| (PREPROC_NOT_KEYWORD? preproc_symbol)
| (PREPROC_LPAREN preproc_logicalExpression PREPROC_RPAREN)
| (PREPROC_NOT_KEYWORD? PREPROC_LPAREN preproc_logicalExpression PREPROC_RPAREN)
;
preproc_logicalExpression
: preproc_logicalOperand (preproc_boolOperation preproc_logicalOperand)*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ void testPreproc_if() {
setInput("Если ТонкийКлиент И ВебКлиент Тогда", BSLLexer.PREPROCESSOR_MODE);
assertMatches(parser.preproc_if());

setInput("IF NOT Server OR NOT(ExternalConnection OR ExternalConnection) THEN", BSLLexer.PREPROCESSOR_MODE);
assertMatches(parser.preproc_if());

setInput("Если MacOS ИЛИ Linux Тогда", BSLLexer.PREPROCESSOR_MODE);
assertMatches(parser.preproc_if());

Expand Down