@@ -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