Skip to content

Commit c7e68f0

Browse files
committed
fix #1050: директива должна быть полностью на одной строке
1 parent d201fde commit c7e68f0

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

src/OneScript.Language/LexicalAnalysis/PreprocessingLexer.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ private class PreprocessorBlock
2828

2929
public PreprocessingLexer()
3030
{
31-
_lexer = new Lexer();
31+
_lexer = new FullSourceLexer();
3232
}
3333

3434
public event EventHandler<PreprocessorUnknownTokenEventArgs> UnknownDirective;
@@ -113,7 +113,7 @@ private SyntaxErrorException PreprocessorError(string message)
113113

114114
private bool SolveExpression()
115115
{
116-
NextLexem();
116+
MoveNextSameLine();
117117

118118
return SolveOrExpression();
119119
}
@@ -128,7 +128,7 @@ private bool SolveOrExpression()
128128

129129
if (_lastExtractedLexem.Token == Token.Or)
130130
{
131-
NextLexem();
131+
MoveNextSameLine();
132132
var secondArgument = SolveOrExpression();
133133
return argument || secondArgument; // здесь нужны НЕ-сокращенные вычисления
134134
}
@@ -142,7 +142,7 @@ private bool SolveAndExpression()
142142

143143
if (_lastExtractedLexem.Token == Token.And)
144144
{
145-
NextLexem();
145+
MoveNextSameLine();
146146
var secondArgument = SolveAndExpression();
147147
return argument && secondArgument; // здесь нужны НЕ-сокращенные вычисления
148148
}
@@ -154,7 +154,7 @@ private bool SolveNotExpression()
154154
{
155155
if (_lastExtractedLexem.Token == Token.Not)
156156
{
157-
NextLexem();
157+
MoveNextSameLine();
158158
return !GetArgument();
159159
}
160160

@@ -165,11 +165,11 @@ private bool GetArgument()
165165
{
166166
if (_lastExtractedLexem.Token == Token.OpenPar)
167167
{
168-
NextLexem();
168+
MoveNextSameLine();
169169
var result = SolveOrExpression();
170170
if (_lastExtractedLexem.Token == Token.ClosePar)
171171
{
172-
NextLexem();
172+
MoveNextSameLine();
173173
return result;
174174
}
175175
throw PreprocessorError("Ожидается закрывающая скобка");
@@ -179,7 +179,7 @@ private bool GetArgument()
179179
throw PreprocessorError("Ожидается объявление препроцессора");
180180

181181
var expression = IsDefined(_lastExtractedLexem.Content);
182-
NextLexem();
182+
MoveNextSameLine();
183183
return expression;
184184
}
185185

@@ -203,10 +203,13 @@ public string Code
203203

204204
public Lexem NextLexem()
205205
{
206-
MoveNext();
207-
208-
if (_lastExtractedLexem.Type == LexemType.PreprocessorDirective)
209-
return Preprocess(_lastExtractedLexem);
206+
do
207+
{
208+
MoveNext();
209+
if (_lastExtractedLexem.Type == LexemType.PreprocessorDirective)
210+
_lastExtractedLexem = Preprocess(_lastExtractedLexem);
211+
}
212+
while (_lastExtractedLexem.Type == LexemType.Comment);
210213

211214
if (_lastExtractedLexem.Type == LexemType.EndOfText)
212215
{
@@ -224,6 +227,13 @@ private void MoveNext()
224227
_lastExtractedLexem = _lexer.NextLexem();
225228
}
226229

230+
private void MoveNextSameLine()
231+
{
232+
_lastExtractedLexem = _lexer.NextLexem();
233+
if (_lexer.Iterator.OnNewLine)
234+
throw PreprocessorError("Неожиданное завершение директивы");
235+
}
236+
227237
private Lexem Preprocess(Lexem directive)
228238
{
229239
if(directive.Token == Token.If)

0 commit comments

Comments
 (0)