1use std::collections::{HashMap, HashSet};
6
7use crate::ast::*;
8use crate::error::{CompileError, ParseError, Result};
9use crate::intern::{InternedStr, StringInterner};
10use crate::macro_infer::detect_assert_kind;
11use crate::preprocessor::Preprocessor;
12use crate::lexer::{Lexer, LookupOnly};
13use crate::source::{FileId, SourceLocation};
14use crate::token::{MacroBeginInfo, MacroInvocationKind, Token, TokenId, TokenKind};
15use crate::token_source::{TokenSliceRef, TokenSource};
16
17#[derive(Debug, Default)]
22pub struct MacroContext {
23 stack: Vec<MacroBeginInfo>,
25}
26
27impl MacroContext {
28 pub fn new() -> Self {
30 Self { stack: Vec::new() }
31 }
32
33 pub fn push(&mut self, info: MacroBeginInfo) {
35 self.stack.push(info);
36 }
37
38 pub fn pop(&mut self) -> Option<MacroBeginInfo> {
40 self.stack.pop()
41 }
42
43 pub fn is_in_macro(&self) -> bool {
45 !self.stack.is_empty()
46 }
47
48 pub fn build_macro_info(&self, interner: &StringInterner) -> Option<MacroExpansionInfo> {
50 if self.stack.is_empty() {
51 return None;
52 }
53
54 let mut info = MacroExpansionInfo::new();
55 for begin_info in &self.stack {
56 let args = match &begin_info.kind {
57 crate::token::MacroInvocationKind::Object => None,
58 crate::token::MacroInvocationKind::Function { args } => {
59 Some(args.iter().map(|arg_tokens| {
61 arg_tokens.iter()
62 .map(|t| t.kind.format(interner))
63 .collect::<Vec<_>>()
64 .join(" ")
65 }).collect())
66 }
67 };
68 info.push(MacroInvocation {
69 name: begin_info.macro_name,
70 call_loc: begin_info.call_loc.clone(),
71 args,
72 });
73 }
74 Some(info)
75 }
76
77 pub fn depth(&self) -> usize {
79 self.stack.len()
80 }
81}
82
83pub struct Parser<'a, S: TokenSource> {
88 source: &'a mut S,
89 current: Token,
90 typedefs: HashSet<InternedStr>,
92 macro_ctx: MacroContext,
94 handle_macro_markers: bool,
96 allow_missing_semi: bool,
98 pub function_call_count: usize,
100 pub deref_count: usize,
102 generic_params: HashMap<InternedStr, usize>,
105 detected_type_params: HashSet<InternedStr>,
107}
108
109impl<'a> Parser<'a, Preprocessor> {
111 pub fn new(pp: &'a mut Preprocessor) -> Result<Self> {
113 Self::from_source(pp)
114 }
115
116 pub fn parse_each<F>(&mut self, mut callback: F) -> Result<()>
122 where
123 F: FnMut(&ExternalDecl, &crate::source::SourceLocation, &std::path::Path, &StringInterner) -> std::ops::ControlFlow<()>,
124 {
125 while !self.is_eof() {
126 let loc = self.current.loc.clone();
127 let decl = self.parse_external_decl()?;
128 let path = self.source.files().get_path(loc.file_id);
129 let interner = self.source.interner();
130 if callback(&decl, &loc, path, interner).is_break() {
131 break;
132 }
133 }
134 Ok(())
135 }
136
137 pub fn parse_each_with_pp<F>(&mut self, mut callback: F) -> Result<()>
143 where
144 F: FnMut(&ExternalDecl, &crate::source::SourceLocation, &std::path::Path, &mut Preprocessor) -> std::ops::ControlFlow<()>,
145 {
146 while !self.is_eof() {
147 let loc = self.current.loc.clone();
148 let decl = self.parse_external_decl()?;
149 let path = self.source.files().get_path(loc.file_id).to_path_buf();
150 if callback(&decl, &loc, &path, self.source).is_break() {
151 break;
152 }
153 }
154 Ok(())
155 }
156}
157
158impl<'a, S: TokenSource> Parser<'a, S> {
160 pub fn from_source(source: &'a mut S) -> Result<Self> {
162 let mut typedefs = HashSet::new();
164 typedefs.insert(source.interner_mut().intern("__builtin_va_list"));
165
166 let mut parser = Self {
167 source,
168 current: Token::default(),
169 typedefs,
170 macro_ctx: MacroContext::new(),
171 handle_macro_markers: false,
172 allow_missing_semi: false,
173 function_call_count: 0,
174 deref_count: 0,
175 generic_params: HashMap::new(),
176 detected_type_params: HashSet::new(),
177 };
178 parser.current = parser.inner_next_token()?;
180
181 Ok(parser)
182 }
183
184 pub fn from_source_with_typedefs(source: &'a mut S, typedefs: HashSet<InternedStr>) -> Result<Self> {
186 let mut parser = Self {
187 source,
188 current: Token::default(),
189 typedefs,
190 macro_ctx: MacroContext::new(),
191 handle_macro_markers: false,
192 allow_missing_semi: false,
193 function_call_count: 0,
194 deref_count: 0,
195 generic_params: HashMap::new(),
196 detected_type_params: HashSet::new(),
197 };
198 parser.current = parser.inner_next_token()?;
200
201 Ok(parser)
202 }
203
204 pub fn set_handle_macro_markers(&mut self, enabled: bool) -> Result<()> {
208 self.handle_macro_markers = enabled;
209
210 if enabled {
212 while matches!(
213 self.current.kind,
214 TokenKind::MacroBegin(_) | TokenKind::MacroEnd(_)
215 ) {
216 match &self.current.kind {
217 TokenKind::MacroBegin(info) => {
218 self.macro_ctx.push((**info).clone());
219 }
220 TokenKind::MacroEnd(_) => {
221 self.macro_ctx.pop();
222 }
223 _ => {}
224 }
225 self.current = self.source.next_token()?;
226 }
227 }
228 Ok(())
229 }
230
231 pub fn interner(&self) -> &crate::intern::StringInterner {
233 self.source.interner()
234 }
235
236 pub fn typedefs(&self) -> &HashSet<InternedStr> {
238 &self.typedefs
239 }
240
241 pub fn parse(&mut self) -> Result<TranslationUnit> {
243 let mut decls = Vec::new();
244
245 while !self.is_eof() {
246 let decl = self.parse_external_decl()?;
247 decls.push(decl);
248 }
249
250 Ok(TranslationUnit { decls })
251 }
252
253 pub fn parse_expr_only(&mut self) -> Result<Expr> {
257 self.parse_expr()
258 }
259
260 pub fn parse_stmt_allow_missing_semi(&mut self) -> Result<Stmt> {
265 self.allow_missing_semi = true;
266 let result = self.parse_stmt();
267 self.allow_missing_semi = false;
268 result
269 }
270
271 fn parse_external_decl(&mut self) -> Result<ExternalDecl> {
273 let comments = self.current.leading_comments.clone();
274 let loc = self.current.loc.clone();
275 let is_target = self.source.is_file_in_target(loc.file_id);
276
277 let specs = self.parse_decl_specs()?;
279
280 if self.check(&TokenKind::Semi) {
282 self.advance()?;
283 return Ok(ExternalDecl::Declaration(Declaration {
284 specs,
285 declarators: Vec::new(),
286 info: NodeInfo::new(loc),
287 comments,
288 is_target,
289 }));
290 }
291
292 let declarator = self.parse_declarator()?;
294
295 self.try_skip_attribute()?;
297
298 if self.check(&TokenKind::LBrace) {
301 let call_count_before = self.function_call_count;
303 let deref_count_before = self.deref_count;
304
305 let body = self.parse_compound_stmt()?;
306
307 let function_call_count = self.function_call_count - call_count_before;
309 let deref_count = self.deref_count - deref_count_before;
310
311 return Ok(ExternalDecl::FunctionDef(FunctionDef {
312 specs,
313 declarator,
314 body,
315 info: NodeInfo::new(loc),
316 comments,
317 is_target,
318 function_call_count,
319 deref_count,
320 }));
321 }
322
323 let mut declarators = Vec::new();
325
326 let init = if self.check(&TokenKind::Eq) {
328 self.advance()?;
329 Some(self.parse_initializer()?)
330 } else {
331 None
332 };
333 declarators.push(InitDeclarator { declarator, init });
334
335 while self.check(&TokenKind::Comma) {
337 self.advance()?;
338 let declarator = self.parse_declarator()?;
339 let init = if self.check(&TokenKind::Eq) {
340 self.advance()?;
341 Some(self.parse_initializer()?)
342 } else {
343 None
344 };
345 declarators.push(InitDeclarator { declarator, init });
346 }
347
348 self.try_skip_attribute()?;
350
351 self.expect(&TokenKind::Semi)?;
352
353 if specs.storage == Some(StorageClass::Typedef) {
355 for d in &declarators {
356 if let Some(name) = d.declarator.name {
357 self.typedefs.insert(name);
358 }
359 }
360 }
361
362 Ok(ExternalDecl::Declaration(Declaration {
363 specs,
364 declarators,
365 info: NodeInfo::new(loc),
366 comments,
367 is_target,
368 }))
369 }
370
371 fn parse_decl_specs(&mut self) -> Result<DeclSpecs> {
373 let mut specs = DeclSpecs::default();
374
375 loop {
376 match &self.current.kind {
377 TokenKind::KwExtension => {
379 self.advance()?;
380 continue;
381 }
382 TokenKind::KwThreadLocal | TokenKind::KwThread => {
384 self.advance()?;
385 continue;
386 }
387 TokenKind::KwTypedef => {
389 specs.storage = Some(StorageClass::Typedef);
390 self.advance()?;
391 }
392 TokenKind::KwExtern => {
393 specs.storage = Some(StorageClass::Extern);
394 self.advance()?;
395 }
396 TokenKind::KwStatic => {
397 specs.storage = Some(StorageClass::Static);
398 self.advance()?;
399 }
400 TokenKind::KwAuto => {
401 specs.storage = Some(StorageClass::Auto);
402 self.advance()?;
403 }
404 TokenKind::KwRegister => {
405 specs.storage = Some(StorageClass::Register);
406 self.advance()?;
407 }
408 TokenKind::KwInline | TokenKind::KwInline2 | TokenKind::KwInline3 => {
410 specs.is_inline = true;
411 self.advance()?;
412 }
413 TokenKind::KwConst | TokenKind::KwConst2 | TokenKind::KwConst3 => {
415 specs.qualifiers.is_const = true;
416 self.advance()?;
417 }
418 TokenKind::KwVolatile | TokenKind::KwVolatile2 | TokenKind::KwVolatile3 => {
419 specs.qualifiers.is_volatile = true;
420 self.advance()?;
421 }
422 TokenKind::KwRestrict | TokenKind::KwRestrict2 | TokenKind::KwRestrict3 => {
423 specs.qualifiers.is_restrict = true;
424 self.advance()?;
425 }
426 TokenKind::KwAtomic => {
427 specs.qualifiers.is_atomic = true;
428 self.advance()?;
429 }
430 TokenKind::KwVoid => {
432 specs.type_specs.push(TypeSpec::Void);
433 self.advance()?;
434 }
435 TokenKind::KwChar => {
436 specs.type_specs.push(TypeSpec::Char);
437 self.advance()?;
438 }
439 TokenKind::KwShort => {
440 specs.type_specs.push(TypeSpec::Short);
441 self.advance()?;
442 }
443 TokenKind::KwInt => {
444 specs.type_specs.push(TypeSpec::Int);
445 self.advance()?;
446 }
447 TokenKind::KwLong => {
448 specs.type_specs.push(TypeSpec::Long);
449 self.advance()?;
450 }
451 TokenKind::KwFloat => {
452 specs.type_specs.push(TypeSpec::Float);
453 self.advance()?;
454 }
455 TokenKind::KwDouble => {
456 specs.type_specs.push(TypeSpec::Double);
457 self.advance()?;
458 }
459 TokenKind::KwSigned | TokenKind::KwSigned2 => {
460 specs.type_specs.push(TypeSpec::Signed);
461 self.advance()?;
462 }
463 TokenKind::KwUnsigned => {
464 specs.type_specs.push(TypeSpec::Unsigned);
465 self.advance()?;
466 }
467 TokenKind::KwBool | TokenKind::KwBool2 => {
468 specs.type_specs.push(TypeSpec::Bool);
469 self.advance()?;
470 }
471 TokenKind::KwComplex => {
472 specs.type_specs.push(TypeSpec::Complex);
473 self.advance()?;
474 }
475 TokenKind::KwFloat16 => {
477 specs.type_specs.push(TypeSpec::Float16);
478 self.advance()?;
479 }
480 TokenKind::KwFloat32 => {
481 specs.type_specs.push(TypeSpec::Float32);
482 self.advance()?;
483 }
484 TokenKind::KwFloat64 => {
485 specs.type_specs.push(TypeSpec::Float64);
486 self.advance()?;
487 }
488 TokenKind::KwFloat128 => {
489 specs.type_specs.push(TypeSpec::Float128);
490 self.advance()?;
491 }
492 TokenKind::KwFloat32x => {
493 specs.type_specs.push(TypeSpec::Float32x);
494 self.advance()?;
495 }
496 TokenKind::KwFloat64x => {
497 specs.type_specs.push(TypeSpec::Float64x);
498 self.advance()?;
499 }
500 TokenKind::KwInt128 => {
502 specs.type_specs.push(TypeSpec::Int128);
503 self.advance()?;
504 }
505 TokenKind::KwTypeof | TokenKind::KwTypeof2 | TokenKind::KwTypeof3 => {
507 self.advance()?;
508 self.expect(&TokenKind::LParen)?;
509 let expr = self.parse_expr()?;
510 self.expect(&TokenKind::RParen)?;
511 specs.type_specs.push(TypeSpec::TypeofExpr(Box::new(expr)));
512 }
513 TokenKind::KwStruct => {
515 specs.type_specs.push(self.parse_struct_or_union(true)?);
516 }
517 TokenKind::KwUnion => {
518 specs.type_specs.push(self.parse_struct_or_union(false)?);
519 }
520 TokenKind::KwEnum => {
521 specs.type_specs.push(self.parse_enum()?);
522 }
523 TokenKind::KwAttribute | TokenKind::KwAttribute2 => {
525 self.skip_attribute()?;
526 }
527 TokenKind::Ident(id) if self.typedefs.contains(id) || self.detected_type_params.contains(id) => {
529 let id = *id;
530 specs.type_specs.push(TypeSpec::TypedefName(id));
531 self.advance()?;
532 }
533 _ => break,
535 }
536 }
537
538 Ok(specs)
539 }
540
541 fn parse_struct_or_union(&mut self, is_struct: bool) -> Result<TypeSpec> {
543 let loc = self.current.loc.clone();
544 self.advance()?; self.try_skip_attribute()?;
548
549 let name = self.current_ident();
551 if name.is_some() {
552 self.advance()?;
553 }
554
555 let members = if self.check(&TokenKind::LBrace) {
557 self.advance()?;
558 let mut members = Vec::new();
559 while !self.check(&TokenKind::RBrace) {
560 members.push(self.parse_struct_member()?);
561 }
562 self.expect(&TokenKind::RBrace)?;
563 Some(members)
564 } else {
565 None
566 };
567
568 let spec = StructSpec { name, members, loc };
569 if is_struct {
570 Ok(TypeSpec::Struct(spec))
571 } else {
572 Ok(TypeSpec::Union(spec))
573 }
574 }
575
576 fn parse_struct_member(&mut self) -> Result<StructMember> {
578 let specs = self.parse_decl_specs()?;
579 let mut declarators = Vec::new();
580
581 loop {
582 let declarator = if self.check(&TokenKind::Colon) {
583 None
584 } else if self.check(&TokenKind::Semi) {
585 None
586 } else {
587 Some(self.parse_declarator()?)
588 };
589
590 self.try_skip_attribute()?;
592
593 let bitfield = if self.check(&TokenKind::Colon) {
594 self.advance()?;
595 Some(Box::new(self.parse_conditional_expr()?))
596 } else {
597 None
598 };
599
600 declarators.push(StructDeclarator { declarator, bitfield });
601
602 if !self.check(&TokenKind::Comma) {
603 break;
604 }
605 self.advance()?;
606 }
607
608 self.expect(&TokenKind::Semi)?;
609
610 Ok(StructMember { specs, declarators })
611 }
612
613 fn parse_enum(&mut self) -> Result<TypeSpec> {
615 let loc = self.current.loc.clone();
616 self.advance()?; let name = self.current_ident();
620 if name.is_some() {
621 self.advance()?;
622 }
623
624 let enumerators = if self.check(&TokenKind::LBrace) {
626 self.advance()?;
627 let mut enums = Vec::new();
628 while !self.check(&TokenKind::RBrace) {
629 let eloc = self.current.loc.clone();
630 let ename = self.expect_ident()?;
631 let value = if self.check(&TokenKind::Eq) {
632 self.advance()?;
633 Some(Box::new(self.parse_conditional_expr()?))
634 } else {
635 None
636 };
637 enums.push(Enumerator {
638 name: ename,
639 value,
640 loc: eloc,
641 });
642 if !self.check(&TokenKind::Comma) {
643 break;
644 }
645 self.advance()?;
646 }
647 self.expect(&TokenKind::RBrace)?;
648 Some(enums)
649 } else {
650 None
651 };
652
653 Ok(TypeSpec::Enum(EnumSpec {
654 name,
655 enumerators,
656 loc,
657 }))
658 }
659
660 fn parse_declarator(&mut self) -> Result<Declarator> {
662 let loc = self.current.loc.clone();
663 let mut derived = Vec::new();
664
665 while self.check(&TokenKind::Star) {
667 self.advance()?;
668 let qualifiers = self.parse_type_qualifiers()?;
669 derived.push(DerivedDecl::Pointer(qualifiers));
670 }
671
672 let (name, inner_derived) = self.parse_direct_declarator()?;
674 derived.extend(inner_derived);
675
676 Ok(Declarator {
677 name,
678 derived,
679 loc,
680 })
681 }
682
683 fn parse_direct_declarator(&mut self) -> Result<(Option<InternedStr>, Vec<DerivedDecl>)> {
685 let mut derived = Vec::new();
686
687 let name = if self.check(&TokenKind::LParen) {
689 self.advance()?;
690 let inner = self.parse_declarator()?;
691 self.expect(&TokenKind::RParen)?;
692 derived = inner.derived;
694 inner.name
695 } else if let Some(id) = self.current_ident() {
696 self.advance()?;
698 Some(id)
699 } else {
700 None
701 };
702
703 loop {
705 if self.check(&TokenKind::LBracket) {
706 derived.push(self.parse_array_declarator()?);
707 } else if self.check(&TokenKind::LParen) {
708 derived.push(self.parse_function_declarator()?);
709 } else {
710 break;
711 }
712 }
713
714 Ok((name, derived))
715 }
716
717 fn parse_array_declarator(&mut self) -> Result<DerivedDecl> {
719 self.advance()?; let mut qualifiers = TypeQualifiers::default();
722 let mut is_static = false;
723 let mut is_vla = false;
724
725 loop {
727 match &self.current.kind {
728 TokenKind::KwStatic => {
729 is_static = true;
730 self.advance()?;
731 }
732 TokenKind::KwConst | TokenKind::KwConst2 | TokenKind::KwConst3 => {
733 qualifiers.is_const = true;
734 self.advance()?;
735 }
736 TokenKind::KwVolatile | TokenKind::KwVolatile2 | TokenKind::KwVolatile3 => {
737 qualifiers.is_volatile = true;
738 self.advance()?;
739 }
740 TokenKind::KwRestrict | TokenKind::KwRestrict2 | TokenKind::KwRestrict3 => {
741 qualifiers.is_restrict = true;
742 self.advance()?;
743 }
744 _ => break,
745 }
746 }
747
748 let size = if self.check(&TokenKind::RBracket) {
750 None
751 } else if self.check(&TokenKind::Star) {
752 is_vla = true;
753 self.advance()?;
754 None
755 } else {
756 Some(Box::new(self.parse_assignment_expr()?))
757 };
758
759 self.expect(&TokenKind::RBracket)?;
760
761 Ok(DerivedDecl::Array(ArrayDecl {
762 size,
763 qualifiers,
764 is_static,
765 is_vla,
766 }))
767 }
768
769 fn parse_function_declarator(&mut self) -> Result<DerivedDecl> {
771 self.advance()?; if self.check(&TokenKind::RParen) {
774 self.advance()?;
775 return Ok(DerivedDecl::Function(ParamList {
776 params: Vec::new(),
777 is_variadic: false,
778 }));
779 }
780
781 let mut params = Vec::new();
782 let mut is_variadic = false;
783
784 loop {
785 if self.check(&TokenKind::Ellipsis) {
786 is_variadic = true;
787 self.advance()?;
788 break;
789 }
790
791 let loc = self.current.loc.clone();
792 let specs = self.parse_decl_specs()?;
793 let declarator = if self.check(&TokenKind::Comma) || self.check(&TokenKind::RParen) {
794 None
795 } else {
796 Some(self.parse_declarator()?)
797 };
798
799 self.try_skip_attribute()?;
801
802 params.push(ParamDecl {
803 specs,
804 declarator,
805 loc,
806 });
807
808 if !self.check(&TokenKind::Comma) {
809 break;
810 }
811 self.advance()?;
812 }
813
814 self.expect(&TokenKind::RParen)?;
815
816 Ok(DerivedDecl::Function(ParamList { params, is_variadic }))
817 }
818
819 fn parse_type_qualifiers(&mut self) -> Result<TypeQualifiers> {
821 let mut qualifiers = TypeQualifiers::default();
822
823 loop {
824 match &self.current.kind {
825 TokenKind::KwConst | TokenKind::KwConst2 | TokenKind::KwConst3 => {
826 qualifiers.is_const = true;
827 self.advance()?;
828 }
829 TokenKind::KwVolatile | TokenKind::KwVolatile2 | TokenKind::KwVolatile3 => {
830 qualifiers.is_volatile = true;
831 self.advance()?;
832 }
833 TokenKind::KwRestrict | TokenKind::KwRestrict2 | TokenKind::KwRestrict3 => {
834 qualifiers.is_restrict = true;
835 self.advance()?;
836 }
837 TokenKind::KwAtomic => {
838 qualifiers.is_atomic = true;
839 self.advance()?;
840 }
841 _ => break,
842 }
843 }
844
845 Ok(qualifiers)
846 }
847
848 fn parse_initializer(&mut self) -> Result<Initializer> {
850 if self.check(&TokenKind::LBrace) {
851 self.advance()?;
852 let mut items = Vec::new();
853
854 while !self.check(&TokenKind::RBrace) {
855 let designation = self.parse_designation()?;
856 let init = self.parse_initializer()?;
857 items.push(InitializerItem { designation, init });
858
859 if !self.check(&TokenKind::Comma) {
860 break;
861 }
862 self.advance()?;
863 }
864 self.expect(&TokenKind::RBrace)?;
865
866 Ok(Initializer::List(items))
867 } else {
868 Ok(Initializer::Expr(Box::new(self.parse_assignment_expr()?)))
869 }
870 }
871
872 fn parse_designation(&mut self) -> Result<Vec<Designator>> {
874 let mut designators = Vec::new();
875
876 loop {
877 if self.check(&TokenKind::LBracket) {
878 self.advance()?;
879 let index = self.parse_conditional_expr()?;
880 self.expect(&TokenKind::RBracket)?;
881 designators.push(Designator::Index(Box::new(index)));
882 } else if self.check(&TokenKind::Dot) {
883 self.advance()?;
884 let name = self.expect_ident()?;
885 designators.push(Designator::Member(name));
886 } else {
887 break;
888 }
889 }
890
891 if !designators.is_empty() {
892 self.expect(&TokenKind::Eq)?;
893 }
894
895 Ok(designators)
896 }
897
898 pub fn parse_type_name(&mut self) -> Result<TypeName> {
900 let specs = self.parse_decl_specs()?;
901 let declarator = if self.check(&TokenKind::RParen) {
902 None
903 } else {
904 Some(self.parse_abstract_declarator()?)
905 };
906 Ok(TypeName { specs, declarator })
907 }
908
909 fn parse_abstract_declarator(&mut self) -> Result<AbstractDeclarator> {
911 let mut derived = Vec::new();
912
913 while self.check(&TokenKind::Star) {
915 self.advance()?;
916 let qualifiers = self.parse_type_qualifiers()?;
917 derived.push(DerivedDecl::Pointer(qualifiers));
918 }
919
920 if self.check(&TokenKind::LParen) {
922 self.advance()?;
925 if !self.check(&TokenKind::RParen) && !self.is_type_start() {
926 let inner = self.parse_abstract_declarator()?;
927 self.expect(&TokenKind::RParen)?;
928 derived.extend(inner.derived);
929 } else {
930 let params = self.parse_param_list_inner()?;
932 derived.push(DerivedDecl::Function(params));
933 }
934 }
935
936 loop {
938 if self.check(&TokenKind::LBracket) {
939 derived.push(self.parse_array_declarator()?);
940 } else if self.check(&TokenKind::LParen) {
941 derived.push(self.parse_function_declarator()?);
942 } else {
943 break;
944 }
945 }
946
947 Ok(AbstractDeclarator { derived })
948 }
949
950 fn parse_param_list_inner(&mut self) -> Result<ParamList> {
952 if self.check(&TokenKind::RParen) {
953 self.advance()?;
954 return Ok(ParamList {
955 params: Vec::new(),
956 is_variadic: false,
957 });
958 }
959
960 let mut params = Vec::new();
961 let mut is_variadic = false;
962
963 loop {
964 if self.check(&TokenKind::Ellipsis) {
965 is_variadic = true;
966 self.advance()?;
967 break;
968 }
969
970 let loc = self.current.loc.clone();
971 let specs = self.parse_decl_specs()?;
972 let declarator = if self.check(&TokenKind::Comma) || self.check(&TokenKind::RParen) {
973 None
974 } else if self.check(&TokenKind::Star) || self.check(&TokenKind::LParen) || self.check(&TokenKind::LBracket) {
975 Some(self.parse_declarator()?)
976 } else if let Some(id) = self.current_ident() {
977 if !self.typedefs.contains(&id) {
980 Some(self.parse_declarator()?)
981 } else {
982 None
983 }
984 } else {
985 None
986 };
987
988 self.try_skip_attribute()?;
990
991 params.push(ParamDecl {
992 specs,
993 declarator,
994 loc,
995 });
996
997 if !self.check(&TokenKind::Comma) {
998 break;
999 }
1000 self.advance()?;
1001 }
1002
1003 self.expect(&TokenKind::RParen)?;
1004
1005 Ok(ParamList { params, is_variadic })
1006 }
1007
1008 fn parse_compound_stmt(&mut self) -> Result<CompoundStmt> {
1012 let loc = self.current.loc.clone();
1013 self.expect(&TokenKind::LBrace)?;
1014
1015 let mut items = Vec::new();
1016 while !self.check(&TokenKind::RBrace) {
1017 items.push(self.parse_block_item()?);
1018 }
1019
1020 self.expect(&TokenKind::RBrace)?;
1021
1022 Ok(CompoundStmt { items, info: NodeInfo::new(loc) })
1023 }
1024
1025 pub(crate) fn parse_block_item(&mut self) -> Result<BlockItem> {
1027 if self.is_declaration_start() {
1028 Ok(BlockItem::Decl(self.parse_declaration()?))
1029 } else {
1030 Ok(BlockItem::Stmt(self.parse_stmt()?))
1031 }
1032 }
1033
1034 fn parse_declaration(&mut self) -> Result<Declaration> {
1036 let comments = self.current.leading_comments.clone();
1037 let loc = self.current.loc.clone();
1038 let is_target = self.source.is_file_in_target(loc.file_id);
1039 let specs = self.parse_decl_specs()?;
1040
1041 if self.check(&TokenKind::Semi) {
1042 self.advance()?;
1043 return Ok(Declaration {
1044 specs,
1045 declarators: Vec::new(),
1046 info: NodeInfo::new(loc),
1047 comments,
1048 is_target,
1049 });
1050 }
1051
1052 let mut declarators = Vec::new();
1053
1054 loop {
1055 let declarator = self.parse_declarator()?;
1056
1057 self.try_skip_attribute()?;
1059
1060 let init = if self.check(&TokenKind::Eq) {
1061 self.advance()?;
1062 Some(self.parse_initializer()?)
1063 } else {
1064 None
1065 };
1066 declarators.push(InitDeclarator { declarator, init });
1067
1068 if !self.check(&TokenKind::Comma) {
1069 break;
1070 }
1071 self.advance()?;
1072 }
1073
1074 self.try_skip_attribute()?;
1076
1077 self.expect(&TokenKind::Semi)?;
1078
1079 if specs.storage == Some(StorageClass::Typedef) {
1081 for d in &declarators {
1082 if let Some(name) = d.declarator.name {
1083 self.typedefs.insert(name);
1084 }
1085 }
1086 }
1087
1088 Ok(Declaration {
1089 specs,
1090 declarators,
1091 info: NodeInfo::new(loc),
1092 comments,
1093 is_target,
1094 })
1095 }
1096
1097 fn parse_stmt(&mut self) -> Result<Stmt> {
1099 let loc = self.current.loc.clone();
1100
1101 match &self.current.kind {
1103 TokenKind::KwCase => return self.parse_case_stmt(),
1105 TokenKind::KwDefault => return self.parse_default_stmt(),
1106 TokenKind::LBrace => return Ok(Stmt::Compound(self.parse_compound_stmt()?)),
1108 TokenKind::KwIf => return self.parse_if_stmt(),
1110 TokenKind::KwSwitch => return self.parse_switch_stmt(),
1111 TokenKind::KwWhile => return self.parse_while_stmt(),
1112 TokenKind::KwDo => return self.parse_do_while_stmt(),
1113 TokenKind::KwFor => return self.parse_for_stmt(),
1114 TokenKind::KwGoto => {
1115 self.advance()?;
1116 let name = self.expect_ident()?;
1117 self.expect(&TokenKind::Semi)?;
1118 return Ok(Stmt::Goto(name, loc));
1119 }
1120 TokenKind::KwContinue => {
1121 self.advance()?;
1122 self.expect(&TokenKind::Semi)?;
1123 return Ok(Stmt::Continue(loc));
1124 }
1125 TokenKind::KwBreak => {
1126 self.advance()?;
1127 self.expect(&TokenKind::Semi)?;
1128 return Ok(Stmt::Break(loc));
1129 }
1130 TokenKind::KwReturn => {
1131 self.advance()?;
1132 let expr = if self.check(&TokenKind::Semi) {
1133 None
1134 } else {
1135 Some(Box::new(self.parse_expr()?))
1136 };
1137 self.expect(&TokenKind::Semi)?;
1138 return Ok(Stmt::Return(expr, loc));
1139 }
1140 TokenKind::KwAsm | TokenKind::KwAsm2 | TokenKind::KwAsm3 => {
1142 return self.parse_asm_stmt();
1143 }
1144 _ => {}
1145 }
1146
1147 if self.check(&TokenKind::Semi) {
1149 self.advance()?;
1150 return Ok(Stmt::Expr(None, loc));
1151 }
1152
1153 let expr = self.parse_expr()?;
1154
1155 if self.check(&TokenKind::Colon) {
1157 if let ExprKind::Ident(name) = expr.kind {
1158 self.advance()?;
1159 let stmt = self.parse_stmt()?;
1160 return Ok(Stmt::Label {
1161 name,
1162 stmt: Box::new(stmt),
1163 loc,
1164 });
1165 }
1166 }
1167
1168 self.expect(&TokenKind::Semi)?;
1169 Ok(Stmt::Expr(Some(Box::new(expr)), loc))
1170 }
1171
1172 fn parse_if_stmt(&mut self) -> Result<Stmt> {
1173 let loc = self.current.loc.clone();
1174 self.advance()?; self.expect(&TokenKind::LParen)?;
1176 let cond = Box::new(self.parse_expr()?);
1177 self.expect(&TokenKind::RParen)?;
1178 let then_stmt = Box::new(self.parse_stmt()?);
1179
1180 let else_stmt = if matches!(self.current.kind, TokenKind::KwElse) {
1181 self.advance()?;
1182 Some(Box::new(self.parse_stmt()?))
1183 } else {
1184 None
1185 };
1186
1187 Ok(Stmt::If {
1188 cond,
1189 then_stmt,
1190 else_stmt,
1191 loc,
1192 })
1193 }
1194
1195 fn parse_switch_stmt(&mut self) -> Result<Stmt> {
1196 let loc = self.current.loc.clone();
1197 self.advance()?; self.expect(&TokenKind::LParen)?;
1199 let expr = Box::new(self.parse_expr()?);
1200 self.expect(&TokenKind::RParen)?;
1201 let body = Box::new(self.parse_stmt()?);
1202
1203 Ok(Stmt::Switch { expr, body, loc })
1204 }
1205
1206 fn parse_while_stmt(&mut self) -> Result<Stmt> {
1207 let loc = self.current.loc.clone();
1208 self.advance()?; self.expect(&TokenKind::LParen)?;
1210 let cond = Box::new(self.parse_expr()?);
1211 self.expect(&TokenKind::RParen)?;
1212 let body = Box::new(self.parse_stmt()?);
1213
1214 Ok(Stmt::While { cond, body, loc })
1215 }
1216
1217 fn parse_do_while_stmt(&mut self) -> Result<Stmt> {
1218 let loc = self.current.loc.clone();
1219 self.advance()?; let body = Box::new(self.parse_stmt()?);
1221 if !matches!(self.current.kind, TokenKind::KwWhile) {
1223 return Err(CompileError::Parse {
1224 loc: self.current.loc.clone(),
1225 kind: ParseError::UnexpectedToken {
1226 expected: "while".to_string(),
1227 found: self.current.kind.clone(),
1228 },
1229 });
1230 }
1231 self.advance()?;
1232 self.expect(&TokenKind::LParen)?;
1233 let cond = Box::new(self.parse_expr()?);
1234 self.expect(&TokenKind::RParen)?;
1235
1236 if self.allow_missing_semi {
1238 if self.check(&TokenKind::Semi) {
1239 self.advance()?;
1240 }
1241 } else {
1242 self.expect(&TokenKind::Semi)?;
1243 }
1244
1245 Ok(Stmt::DoWhile { body, cond, loc })
1246 }
1247
1248 fn parse_for_stmt(&mut self) -> Result<Stmt> {
1249 let loc = self.current.loc.clone();
1250 self.advance()?; self.expect(&TokenKind::LParen)?;
1252
1253 let init = if self.check(&TokenKind::Semi) {
1255 self.advance()?;
1256 None
1257 } else if self.is_declaration_start() {
1258 let decl = self.parse_declaration()?;
1259 Some(ForInit::Decl(decl))
1260 } else {
1261 let expr = self.parse_expr()?;
1262 self.expect(&TokenKind::Semi)?;
1263 Some(ForInit::Expr(Box::new(expr)))
1264 };
1265
1266 let cond = if self.check(&TokenKind::Semi) {
1268 None
1269 } else {
1270 Some(Box::new(self.parse_expr()?))
1271 };
1272 self.expect(&TokenKind::Semi)?;
1273
1274 let step = if self.check(&TokenKind::RParen) {
1276 None
1277 } else {
1278 Some(Box::new(self.parse_expr()?))
1279 };
1280 self.expect(&TokenKind::RParen)?;
1281
1282 let body = Box::new(self.parse_stmt()?);
1283
1284 Ok(Stmt::For {
1285 init,
1286 cond,
1287 step,
1288 body,
1289 loc,
1290 })
1291 }
1292
1293 fn parse_case_stmt(&mut self) -> Result<Stmt> {
1294 let loc = self.current.loc.clone();
1295 self.advance()?; let expr = Box::new(self.parse_conditional_expr()?);
1297 self.expect(&TokenKind::Colon)?;
1298 let stmt = Box::new(self.parse_stmt()?);
1299
1300 Ok(Stmt::Case { expr, stmt, loc })
1301 }
1302
1303 fn parse_default_stmt(&mut self) -> Result<Stmt> {
1304 let loc = self.current.loc.clone();
1305 self.advance()?; self.expect(&TokenKind::Colon)?;
1307 let stmt = Box::new(self.parse_stmt()?);
1308
1309 Ok(Stmt::Default { stmt, loc })
1310 }
1311
1312 fn parse_asm_stmt(&mut self) -> Result<Stmt> {
1313 let loc = self.current.loc.clone();
1314 self.advance()?; while matches!(
1318 self.current.kind,
1319 TokenKind::KwVolatile | TokenKind::KwVolatile2 | TokenKind::KwVolatile3
1320 ) {
1321 self.advance()?;
1322 }
1323
1324 self.expect(&TokenKind::LParen)?;
1326 self.skip_balanced_parens()?;
1327
1328 self.expect(&TokenKind::Semi)?;
1329 Ok(Stmt::Asm { loc })
1330 }
1331
1332 fn parse_expr(&mut self) -> Result<Expr> {
1336 let lhs = self.parse_assignment_expr()?;
1337
1338 if self.check(&TokenKind::Comma) {
1339 let loc = self.current.loc.clone();
1340 self.advance()?;
1341 let rhs = self.parse_expr()?;
1342 return Ok(Expr::new(
1343 ExprKind::Comma {
1344 lhs: Box::new(lhs),
1345 rhs: Box::new(rhs),
1346 },
1347 loc,
1348 ));
1349 }
1350
1351 Ok(lhs)
1352 }
1353
1354 fn parse_assignment_expr(&mut self) -> Result<Expr> {
1356 let lhs = self.parse_conditional_expr()?;
1357
1358 let op = match &self.current.kind {
1359 TokenKind::Eq => Some(AssignOp::Assign),
1360 TokenKind::StarEq => Some(AssignOp::MulAssign),
1361 TokenKind::SlashEq => Some(AssignOp::DivAssign),
1362 TokenKind::PercentEq => Some(AssignOp::ModAssign),
1363 TokenKind::PlusEq => Some(AssignOp::AddAssign),
1364 TokenKind::MinusEq => Some(AssignOp::SubAssign),
1365 TokenKind::LtLtEq => Some(AssignOp::ShlAssign),
1366 TokenKind::GtGtEq => Some(AssignOp::ShrAssign),
1367 TokenKind::AmpEq => Some(AssignOp::AndAssign),
1368 TokenKind::CaretEq => Some(AssignOp::XorAssign),
1369 TokenKind::PipeEq => Some(AssignOp::OrAssign),
1370 _ => None,
1371 };
1372
1373 if let Some(op) = op {
1374 let loc = self.current.loc.clone();
1375 self.advance()?;
1376 let rhs = self.parse_assignment_expr()?;
1377 return Ok(Expr::new(
1378 ExprKind::Assign {
1379 op,
1380 lhs: Box::new(lhs),
1381 rhs: Box::new(rhs),
1382 },
1383 loc,
1384 ));
1385 }
1386
1387 Ok(lhs)
1388 }
1389
1390 fn parse_conditional_expr(&mut self) -> Result<Expr> {
1392 let cond = self.parse_logical_or_expr()?;
1393
1394 if self.check(&TokenKind::Question) {
1395 let loc = self.current.loc.clone();
1396 self.advance()?;
1397 let then_expr = self.parse_expr()?;
1398 self.expect(&TokenKind::Colon)?;
1399 let else_expr = self.parse_conditional_expr()?;
1400 return Ok(Expr::new(
1401 ExprKind::Conditional {
1402 cond: Box::new(cond),
1403 then_expr: Box::new(then_expr),
1404 else_expr: Box::new(else_expr),
1405 },
1406 loc,
1407 ));
1408 }
1409
1410 Ok(cond)
1411 }
1412
1413 fn parse_logical_or_expr(&mut self) -> Result<Expr> {
1415 let mut lhs = self.parse_logical_and_expr()?;
1416
1417 while self.check(&TokenKind::PipePipe) {
1418 let loc = self.current.loc.clone();
1419 self.advance()?;
1420 let rhs = self.parse_logical_and_expr()?;
1421 lhs = Expr::new(
1422 ExprKind::Binary {
1423 op: BinOp::LogOr,
1424 lhs: Box::new(lhs),
1425 rhs: Box::new(rhs),
1426 },
1427 loc,
1428 );
1429 }
1430
1431 Ok(lhs)
1432 }
1433
1434 fn parse_logical_and_expr(&mut self) -> Result<Expr> {
1436 let mut lhs = self.parse_bitwise_or_expr()?;
1437
1438 while self.check(&TokenKind::AmpAmp) {
1439 let loc = self.current.loc.clone();
1440 self.advance()?;
1441 let rhs = self.parse_bitwise_or_expr()?;
1442 lhs = Expr::new(
1443 ExprKind::Binary {
1444 op: BinOp::LogAnd,
1445 lhs: Box::new(lhs),
1446 rhs: Box::new(rhs),
1447 },
1448 loc,
1449 );
1450 }
1451
1452 Ok(lhs)
1453 }
1454
1455 fn parse_bitwise_or_expr(&mut self) -> Result<Expr> {
1457 let mut lhs = self.parse_bitwise_xor_expr()?;
1458
1459 while self.check(&TokenKind::Pipe) {
1460 let loc = self.current.loc.clone();
1461 self.advance()?;
1462 let rhs = self.parse_bitwise_xor_expr()?;
1463 lhs = Expr::new(
1464 ExprKind::Binary {
1465 op: BinOp::BitOr,
1466 lhs: Box::new(lhs),
1467 rhs: Box::new(rhs),
1468 },
1469 loc,
1470 );
1471 }
1472
1473 Ok(lhs)
1474 }
1475
1476 fn parse_bitwise_xor_expr(&mut self) -> Result<Expr> {
1478 let mut lhs = self.parse_bitwise_and_expr()?;
1479
1480 while self.check(&TokenKind::Caret) {
1481 let loc = self.current.loc.clone();
1482 self.advance()?;
1483 let rhs = self.parse_bitwise_and_expr()?;
1484 lhs = Expr::new(
1485 ExprKind::Binary {
1486 op: BinOp::BitXor,
1487 lhs: Box::new(lhs),
1488 rhs: Box::new(rhs),
1489 },
1490 loc,
1491 );
1492 }
1493
1494 Ok(lhs)
1495 }
1496
1497 fn parse_bitwise_and_expr(&mut self) -> Result<Expr> {
1499 let mut lhs = self.parse_equality_expr()?;
1500
1501 while self.check(&TokenKind::Amp) {
1502 let loc = self.current.loc.clone();
1503 self.advance()?;
1504 let rhs = self.parse_equality_expr()?;
1505 lhs = Expr::new(
1506 ExprKind::Binary {
1507 op: BinOp::BitAnd,
1508 lhs: Box::new(lhs),
1509 rhs: Box::new(rhs),
1510 },
1511 loc,
1512 );
1513 }
1514
1515 Ok(lhs)
1516 }
1517
1518 fn parse_equality_expr(&mut self) -> Result<Expr> {
1520 let mut lhs = self.parse_relational_expr()?;
1521
1522 loop {
1523 let op = match &self.current.kind {
1524 TokenKind::EqEq => BinOp::Eq,
1525 TokenKind::BangEq => BinOp::Ne,
1526 _ => break,
1527 };
1528 let loc = self.current.loc.clone();
1529 self.advance()?;
1530 let rhs = self.parse_relational_expr()?;
1531 lhs = Expr::new(
1532 ExprKind::Binary {
1533 op,
1534 lhs: Box::new(lhs),
1535 rhs: Box::new(rhs),
1536 },
1537 loc,
1538 );
1539 }
1540
1541 Ok(lhs)
1542 }
1543
1544 fn parse_relational_expr(&mut self) -> Result<Expr> {
1546 let mut lhs = self.parse_shift_expr()?;
1547
1548 loop {
1549 let op = match &self.current.kind {
1550 TokenKind::Lt => BinOp::Lt,
1551 TokenKind::Gt => BinOp::Gt,
1552 TokenKind::LtEq => BinOp::Le,
1553 TokenKind::GtEq => BinOp::Ge,
1554 _ => break,
1555 };
1556 let loc = self.current.loc.clone();
1557 self.advance()?;
1558 let rhs = self.parse_shift_expr()?;
1559 lhs = Expr::new(
1560 ExprKind::Binary {
1561 op,
1562 lhs: Box::new(lhs),
1563 rhs: Box::new(rhs),
1564 },
1565 loc,
1566 );
1567 }
1568
1569 Ok(lhs)
1570 }
1571
1572 fn parse_shift_expr(&mut self) -> Result<Expr> {
1574 let mut lhs = self.parse_additive_expr()?;
1575
1576 loop {
1577 let op = match &self.current.kind {
1578 TokenKind::LtLt => BinOp::Shl,
1579 TokenKind::GtGt => BinOp::Shr,
1580 _ => break,
1581 };
1582 let loc = self.current.loc.clone();
1583 self.advance()?;
1584 let rhs = self.parse_additive_expr()?;
1585 lhs = Expr::new(
1586 ExprKind::Binary {
1587 op,
1588 lhs: Box::new(lhs),
1589 rhs: Box::new(rhs),
1590 },
1591 loc,
1592 );
1593 }
1594
1595 Ok(lhs)
1596 }
1597
1598 fn parse_additive_expr(&mut self) -> Result<Expr> {
1600 let mut lhs = self.parse_multiplicative_expr()?;
1601
1602 loop {
1603 let op = match &self.current.kind {
1604 TokenKind::Plus => BinOp::Add,
1605 TokenKind::Minus => BinOp::Sub,
1606 _ => break,
1607 };
1608 let loc = self.current.loc.clone();
1609 self.advance()?;
1610 let rhs = self.parse_multiplicative_expr()?;
1611 lhs = Expr::new(
1612 ExprKind::Binary {
1613 op,
1614 lhs: Box::new(lhs),
1615 rhs: Box::new(rhs),
1616 },
1617 loc,
1618 );
1619 }
1620
1621 Ok(lhs)
1622 }
1623
1624 fn parse_multiplicative_expr(&mut self) -> Result<Expr> {
1626 let mut lhs = self.parse_cast_expr()?;
1627
1628 loop {
1629 let op = match &self.current.kind {
1630 TokenKind::Star => BinOp::Mul,
1631 TokenKind::Slash => BinOp::Div,
1632 TokenKind::Percent => BinOp::Mod,
1633 _ => break,
1634 };
1635 let loc = self.current.loc.clone();
1636 self.advance()?;
1637 let rhs = self.parse_cast_expr()?;
1638 lhs = Expr::new(
1639 ExprKind::Binary {
1640 op,
1641 lhs: Box::new(lhs),
1642 rhs: Box::new(rhs),
1643 },
1644 loc,
1645 );
1646 }
1647
1648 Ok(lhs)
1649 }
1650
1651 fn parse_cast_expr(&mut self) -> Result<Expr> {
1653 if self.check(&TokenKind::LParen) {
1656 let loc = self.current.loc.clone();
1657 self.advance()?; if self.is_type_start() {
1661 return self.finish_parse_cast_or_compound_lit(loc);
1662 }
1663
1664 if let Some(id) = self.current_ident() {
1666 if self.generic_params.contains_key(&id)
1667 && self.looks_like_generic_cast()
1668 {
1669 self.detected_type_params.insert(id);
1671 return self.finish_parse_cast_or_compound_lit(loc);
1672 }
1673 }
1674
1675 if self.check(&TokenKind::LBrace) {
1676 let stmt = self.parse_compound_stmt()?;
1678 self.expect(&TokenKind::RParen)?;
1679 let stmt_expr = Expr::new(ExprKind::StmtExpr(stmt), loc);
1681 return self.parse_postfix_on(stmt_expr);
1682 } else {
1683 let expr = self.parse_expr()?;
1687 self.expect(&TokenKind::RParen)?;
1688 return self.parse_postfix_on(expr);
1690 }
1691 }
1692
1693 self.parse_unary_expr()
1694 }
1695
1696 fn finish_parse_cast_or_compound_lit(&mut self, loc: SourceLocation) -> Result<Expr> {
1700 let type_name = self.parse_type_name()?;
1701 self.expect(&TokenKind::RParen)?;
1702
1703 if self.check(&TokenKind::LBrace) {
1705 self.advance()?;
1706 let mut items = Vec::new();
1707 while !self.check(&TokenKind::RBrace) {
1708 let designation = self.parse_designation()?;
1709 let init = self.parse_initializer()?;
1710 items.push(InitializerItem { designation, init });
1711 if !self.check(&TokenKind::Comma) {
1712 break;
1713 }
1714 self.advance()?;
1715 }
1716 self.expect(&TokenKind::RBrace)?;
1717 return Ok(Expr::new(
1718 ExprKind::CompoundLit {
1719 type_name: Box::new(type_name),
1720 init: items,
1721 },
1722 loc,
1723 ));
1724 }
1725
1726 let expr = self.parse_cast_expr()?;
1727 Ok(Expr::new(
1728 ExprKind::Cast {
1729 type_name: Box::new(type_name),
1730 expr: Box::new(expr),
1731 },
1732 loc,
1733 ))
1734 }
1735
1736 fn looks_like_generic_cast(&mut self) -> bool {
1741 let next1 = match self.source.next_token() {
1743 Ok(t) => t,
1744 Err(_) => return false,
1745 };
1746
1747 let result = match &next1.kind {
1748 TokenKind::Star => true,
1750
1751 TokenKind::RParen => {
1753 let next2 = match self.source.next_token() {
1754 Ok(t) => t,
1755 Err(_) => {
1756 self.source.unget_token(next1);
1757 return false;
1758 }
1759 };
1760 let is_cast = match &next2.kind {
1762 TokenKind::LParen | TokenKind::Ident(_) | TokenKind::IntLit(_) | TokenKind::UIntLit(_)
1765 | TokenKind::FloatLit(_)
1766 | TokenKind::StringLit(_) | TokenKind::CharLit(_)
1767 | TokenKind::Star | TokenKind::Amp | TokenKind::Bang | TokenKind::Tilde | TokenKind::KwSizeof => true,
1773
1774 TokenKind::Minus => {
1778 let next3 = match self.source.next_token() {
1779 Ok(t) => t,
1780 Err(_) => {
1781 self.source.unget_token(next2);
1782 self.source.unget_token(next1);
1783 return false;
1784 }
1785 };
1786 let is_numeric = matches!(&next3.kind,
1787 TokenKind::IntLit(_)
1788 | TokenKind::UIntLit(_)
1789 | TokenKind::FloatLit(_)
1790 );
1791 self.source.unget_token(next3);
1792 is_numeric
1793 }
1794
1795 _ => false,
1796 };
1797 self.source.unget_token(next2);
1798 is_cast
1799 }
1800
1801 _ => false,
1803 };
1804
1805 self.source.unget_token(next1);
1806 result
1807 }
1808
1809 fn parse_postfix_on(&mut self, mut expr: Expr) -> Result<Expr> {
1811 loop {
1812 let loc = self.current.loc.clone();
1813 match &self.current.kind {
1814 TokenKind::LBracket => {
1815 self.advance()?;
1816 let index = self.parse_expr()?;
1817 self.expect(&TokenKind::RBracket)?;
1818 expr = Expr::new(
1819 ExprKind::Index {
1820 expr: Box::new(expr),
1821 index: Box::new(index),
1822 },
1823 loc,
1824 );
1825 }
1826 TokenKind::LParen => {
1827 self.advance()?;
1828 let mut args = Vec::new();
1829 while !self.check(&TokenKind::RParen) {
1830 args.push(self.parse_assignment_expr()?);
1831 if !self.check(&TokenKind::Comma) {
1832 break;
1833 }
1834 self.advance()?;
1835 }
1836 self.expect(&TokenKind::RParen)?;
1837 self.function_call_count += 1;
1838 expr = Expr::new(
1839 ExprKind::Call {
1840 func: Box::new(expr),
1841 args,
1842 },
1843 loc,
1844 );
1845 }
1846 TokenKind::Dot => {
1847 self.advance()?;
1848 let member = self.expect_ident()?;
1849 expr = Expr::new(
1850 ExprKind::Member {
1851 expr: Box::new(expr),
1852 member,
1853 },
1854 loc,
1855 );
1856 }
1857 TokenKind::Arrow => {
1858 self.advance()?;
1859 let member = self.expect_ident()?;
1860 self.deref_count += 1;
1861 expr = Expr::new(
1862 ExprKind::PtrMember {
1863 expr: Box::new(expr),
1864 member,
1865 },
1866 loc,
1867 );
1868 }
1869 TokenKind::PlusPlus => {
1870 self.advance()?;
1871 expr = Expr::new(ExprKind::PostInc(Box::new(expr)), loc);
1872 }
1873 TokenKind::MinusMinus => {
1874 self.advance()?;
1875 expr = Expr::new(ExprKind::PostDec(Box::new(expr)), loc);
1876 }
1877 _ => break,
1878 }
1879 }
1880 Ok(expr)
1881 }
1882
1883 fn parse_unary_expr(&mut self) -> Result<Expr> {
1885 let loc = self.current.loc.clone();
1886
1887 match &self.current.kind {
1888 TokenKind::PlusPlus => {
1889 self.advance()?;
1890 let expr = self.parse_unary_expr()?;
1891 Ok(Expr::new(ExprKind::PreInc(Box::new(expr)), loc))
1892 }
1893 TokenKind::MinusMinus => {
1894 self.advance()?;
1895 let expr = self.parse_unary_expr()?;
1896 Ok(Expr::new(ExprKind::PreDec(Box::new(expr)), loc))
1897 }
1898 TokenKind::Amp => {
1899 self.advance()?;
1900 let expr = self.parse_cast_expr()?;
1901 Ok(Expr::new(ExprKind::AddrOf(Box::new(expr)), loc))
1902 }
1903 TokenKind::Star => {
1904 self.advance()?;
1905 let expr = self.parse_cast_expr()?;
1906 self.deref_count += 1;
1907 Ok(Expr::new(ExprKind::Deref(Box::new(expr)), loc))
1908 }
1909 TokenKind::Plus => {
1910 self.advance()?;
1911 let expr = self.parse_cast_expr()?;
1912 Ok(Expr::new(ExprKind::UnaryPlus(Box::new(expr)), loc))
1913 }
1914 TokenKind::Minus => {
1915 self.advance()?;
1916 let expr = self.parse_cast_expr()?;
1917 Ok(Expr::new(ExprKind::UnaryMinus(Box::new(expr)), loc))
1918 }
1919 TokenKind::Tilde => {
1920 self.advance()?;
1921 let expr = self.parse_cast_expr()?;
1922 Ok(Expr::new(ExprKind::BitNot(Box::new(expr)), loc))
1923 }
1924 TokenKind::Bang => {
1925 self.advance()?;
1926 let expr = self.parse_cast_expr()?;
1927 Ok(Expr::new(ExprKind::LogNot(Box::new(expr)), loc))
1928 }
1929 TokenKind::KwSizeof => {
1930 self.advance()?;
1931 if self.check(&TokenKind::LParen) {
1932 self.advance()?; if self.is_type_start() {
1934 let type_name = self.parse_type_name()?;
1936 self.expect(&TokenKind::RParen)?;
1937 Ok(Expr::new(ExprKind::SizeofType(Box::new(type_name)), loc))
1938 } else {
1939 let expr = self.parse_expr()?;
1941 self.expect(&TokenKind::RParen)?;
1942 Ok(Expr::new(ExprKind::Sizeof(Box::new(expr)), loc))
1943 }
1944 } else {
1945 let expr = self.parse_unary_expr()?;
1946 Ok(Expr::new(ExprKind::Sizeof(Box::new(expr)), loc))
1947 }
1948 }
1949 TokenKind::KwAlignof | TokenKind::KwAlignof2 | TokenKind::KwAlignof3 => {
1950 self.advance()?;
1951 self.expect(&TokenKind::LParen)?;
1952 let type_name = self.parse_type_name()?;
1953 self.expect(&TokenKind::RParen)?;
1954 Ok(Expr::new(ExprKind::Alignof(Box::new(type_name)), loc))
1955 }
1956 TokenKind::KwExtension => {
1958 self.advance()?;
1959 self.parse_unary_expr()
1960 }
1961 _ => self.parse_postfix_expr(),
1962 }
1963 }
1964
1965 fn parse_postfix_expr(&mut self) -> Result<Expr> {
1967 let mut expr = self.parse_primary_expr()?;
1968
1969 loop {
1970 let loc = self.current.loc.clone();
1971 match &self.current.kind {
1972 TokenKind::LBracket => {
1973 self.advance()?;
1974 let index = self.parse_expr()?;
1975 self.expect(&TokenKind::RBracket)?;
1976 expr = Expr::new(
1977 ExprKind::Index {
1978 expr: Box::new(expr),
1979 index: Box::new(index),
1980 },
1981 loc,
1982 );
1983 }
1984 TokenKind::LParen => {
1985 if let ExprKind::Ident(name) = &expr.kind {
1987 if self.is_type_arg_builtin(*name) {
1988 let builtin_name = *name;
1989 self.advance()?; let args = self.parse_builtin_args()?;
1991 self.expect(&TokenKind::RParen)?;
1992 self.function_call_count += 1;
1993 expr = Expr::new(
1994 ExprKind::BuiltinCall { name: builtin_name, args },
1995 loc,
1996 );
1997 continue;
1998 }
1999 }
2000 self.advance()?;
2002 let mut args = Vec::new();
2003 if !self.check(&TokenKind::RParen) {
2004 loop {
2005 args.push(self.parse_assignment_expr()?);
2006 if !self.check(&TokenKind::Comma) {
2007 break;
2008 }
2009 self.advance()?;
2010 }
2011 }
2012 self.expect(&TokenKind::RParen)?;
2013 self.function_call_count += 1;
2014 expr = Expr::new(
2015 ExprKind::Call {
2016 func: Box::new(expr),
2017 args,
2018 },
2019 loc,
2020 );
2021 }
2022 TokenKind::Dot => {
2023 self.advance()?;
2024 let member = self.expect_ident()?;
2025 expr = Expr::new(
2026 ExprKind::Member {
2027 expr: Box::new(expr),
2028 member,
2029 },
2030 loc,
2031 );
2032 }
2033 TokenKind::Arrow => {
2034 self.advance()?;
2035 let member = self.expect_ident()?;
2036 self.deref_count += 1;
2037 expr = Expr::new(
2038 ExprKind::PtrMember {
2039 expr: Box::new(expr),
2040 member,
2041 },
2042 loc,
2043 );
2044 }
2045 TokenKind::PlusPlus => {
2046 self.advance()?;
2047 expr = Expr::new(ExprKind::PostInc(Box::new(expr)), loc);
2048 }
2049 TokenKind::MinusMinus => {
2050 self.advance()?;
2051 expr = Expr::new(ExprKind::PostDec(Box::new(expr)), loc);
2052 }
2053 _ => break,
2054 }
2055 }
2056
2057 Ok(expr)
2058 }
2059
2060 fn parse_primary_expr(&mut self) -> Result<Expr> {
2062 let loc = self.current.loc.clone();
2063
2064 match &self.current.kind {
2065 TokenKind::Ident(id) => {
2066 let id = *id;
2067 self.advance()?;
2068 Ok(Expr::new(ExprKind::Ident(id), loc))
2069 }
2070 TokenKind::IntLit(n) => {
2071 let n = *n;
2072 self.advance()?;
2073 Ok(Expr::new(ExprKind::IntLit(n), loc))
2074 }
2075 TokenKind::UIntLit(n) => {
2076 let n = *n;
2077 self.advance()?;
2078 Ok(Expr::new(ExprKind::UIntLit(n), loc))
2079 }
2080 TokenKind::FloatLit(f) => {
2081 let f = *f;
2082 self.advance()?;
2083 Ok(Expr::new(ExprKind::FloatLit(f), loc))
2084 }
2085 TokenKind::CharLit(c) => {
2086 let c = *c;
2087 self.advance()?;
2088 Ok(Expr::new(ExprKind::CharLit(c), loc))
2089 }
2090 TokenKind::StringLit(s) => {
2091 let mut bytes = s.clone();
2092 self.advance()?;
2093 while let TokenKind::StringLit(s2) = &self.current.kind {
2095 bytes.extend_from_slice(s2);
2096 self.advance()?;
2097 }
2098 Ok(Expr::new(ExprKind::StringLit(bytes), loc))
2099 }
2100 TokenKind::LParen => {
2101 self.advance()?;
2102 if self.check(&TokenKind::LBrace) {
2104 let stmt = self.parse_compound_stmt()?;
2105 self.expect(&TokenKind::RParen)?;
2106 Ok(Expr::new(ExprKind::StmtExpr(stmt), loc))
2107 } else {
2108 let expr = self.parse_expr()?;
2109 self.expect(&TokenKind::RParen)?;
2110 Ok(expr)
2111 }
2112 }
2113 TokenKind::MacroBegin(info) if info.is_wrapped => {
2114 self.parse_wrapped_macro_expr()
2116 }
2117 TokenKind::MacroBegin(info) if info.preserve_call => {
2118 self.parse_macro_call_expr()
2120 }
2121 _ => Err(CompileError::Parse {
2122 loc,
2123 kind: ParseError::UnexpectedToken {
2124 expected: "primary expression".to_string(),
2125 found: self.current.kind.clone(),
2126 },
2127 }),
2128 }
2129 }
2130
2131 fn parse_wrapped_macro_expr(&mut self) -> Result<Expr> {
2139 let loc = self.current.loc.clone();
2140
2141 let (marker_id, macro_name, args) = match &self.current.kind {
2143 TokenKind::MacroBegin(info) if info.is_wrapped => {
2144 let args = match &info.kind {
2145 MacroInvocationKind::Function { args } => args.clone(),
2146 MacroInvocationKind::Object => {
2147 let name = self.source.interner().get(info.macro_name).to_string();
2148 return Err(CompileError::Parse {
2149 loc,
2150 kind: ParseError::AssertNotFunctionMacro { macro_name: name },
2151 });
2152 }
2153 };
2154 (info.marker_id, info.macro_name, args)
2155 }
2156 _ => unreachable!("parse_wrapped_macro_expr called without wrapped MacroBegin"),
2157 };
2158
2159 if args.len() != 1 {
2161 let name = self.source.interner().get(macro_name).to_string();
2162 return Err(CompileError::Parse {
2163 loc,
2164 kind: ParseError::InvalidAssertArgs {
2165 macro_name: name,
2166 arg_count: args.len(),
2167 },
2168 });
2169 }
2170
2171 let condition = self.parse_expr_from_tokens(&args[0], &loc)?;
2173
2174 let macro_name_str = self.source.interner().get(macro_name);
2176 let kind = detect_assert_kind(macro_name_str).unwrap_or(AssertKind::Assert);
2177
2178 self.skip_to_macro_end(marker_id)?;
2182
2183 let assert_expr = Expr::new(ExprKind::Assert {
2184 kind,
2185 condition: Box::new(condition),
2186 }, loc.clone());
2187
2188 if self.is_expression_start() {
2191 let next_expr = self.parse_assignment_expr()?;
2193 Ok(Expr::new(
2194 ExprKind::Comma {
2195 lhs: Box::new(assert_expr),
2196 rhs: Box::new(next_expr),
2197 },
2198 loc,
2199 ))
2200 } else {
2201 Ok(assert_expr)
2202 }
2203 }
2204
2205 fn parse_macro_call_expr(&mut self) -> Result<Expr> {
2214 let loc = self.current.loc.clone();
2215
2216 let (marker_id, macro_name, raw_args, call_loc) = match &self.current.kind {
2218 TokenKind::MacroBegin(info) if info.preserve_call => {
2219 let args = match &info.kind {
2220 MacroInvocationKind::Function { args } => args.clone(),
2221 MacroInvocationKind::Object => Vec::new(),
2222 };
2223 (info.marker_id, info.macro_name, args, info.call_loc.clone())
2224 }
2225 _ => unreachable!("parse_macro_call_expr called without preserve_call MacroBegin"),
2226 };
2227
2228 let expanded_tokens = self.collect_tokens_until_macro_end(marker_id)?;
2231
2232 let expanded = if expanded_tokens.is_empty() {
2234 Expr::new(ExprKind::IntLit(0), loc.clone())
2236 } else {
2237 crate::parser::parse_expression_from_tokens_ref(
2238 expanded_tokens,
2239 self.source.interner(),
2240 self.source.files(),
2241 &self.typedefs,
2242 )?
2243 };
2244
2245 let parsed_args: Result<Vec<Expr>> = raw_args.iter()
2247 .map(|arg_tokens| {
2248 if arg_tokens.is_empty() {
2249 Ok(Expr::new(ExprKind::IntLit(0), loc.clone()))
2251 } else {
2252 crate::parser::parse_expression_from_tokens_ref(
2253 arg_tokens.clone(),
2254 self.source.interner(),
2255 self.source.files(),
2256 &self.typedefs,
2257 )
2258 }
2259 })
2260 .collect();
2261 let args = parsed_args?;
2262
2263 self.current = self.inner_next_token()?;
2265
2266 Ok(Expr::new(ExprKind::MacroCall {
2267 name: macro_name,
2268 args,
2269 expanded: Box::new(expanded),
2270 call_loc,
2271 }, loc))
2272 }
2273
2274 fn collect_tokens_until_macro_end(&mut self, target_marker_id: TokenId) -> Result<Vec<Token>> {
2278 let mut tokens = Vec::new();
2279 let mut nested_depth = 0;
2280
2281 loop {
2282 let token = self.source.next_token()?;
2283
2284 match &token.kind {
2285 TokenKind::MacroBegin(_) => {
2286 nested_depth += 1;
2288 tokens.push(token);
2289 }
2290 TokenKind::MacroEnd(info) => {
2291 if nested_depth > 0 {
2292 nested_depth -= 1;
2294 tokens.push(token);
2295 } else if info.begin_marker_id == target_marker_id {
2296 return Ok(tokens);
2298 } else {
2299 tokens.push(token);
2301 }
2302 }
2303 TokenKind::Eof => {
2304 return Err(CompileError::Parse {
2305 loc: token.loc,
2306 kind: ParseError::UnexpectedToken {
2307 expected: "MacroEnd".to_string(),
2308 found: token.kind,
2309 },
2310 });
2311 }
2312 _ => {
2313 tokens.push(token);
2314 }
2315 }
2316 }
2317 }
2318
2319 fn is_expression_start(&self) -> bool {
2321 match &self.current.kind {
2322 TokenKind::Ident(_)
2324 | TokenKind::IntLit(_)
2325 | TokenKind::UIntLit(_)
2326 | TokenKind::FloatLit(_)
2327 | TokenKind::CharLit(_)
2328 | TokenKind::WideCharLit(_)
2329 | TokenKind::StringLit(_)
2330 | TokenKind::WideStringLit(_)
2331 | TokenKind::LParen
2332 | TokenKind::Star | TokenKind::Amp | TokenKind::Plus | TokenKind::Minus | TokenKind::Bang | TokenKind::Tilde | TokenKind::PlusPlus | TokenKind::MinusMinus | TokenKind::KwSizeof
2341 | TokenKind::KwAlignof
2342 | TokenKind::KwAlignof2
2343 | TokenKind::KwAlignof3
2344 | TokenKind::MacroBegin(_) => true, _ => false,
2346 }
2347 }
2348
2349 fn parse_expr_from_tokens(&self, tokens: &[Token], loc: &SourceLocation) -> Result<Expr> {
2354 for token in tokens {
2356 if let TokenKind::MacroBegin(info) = &token.kind {
2357 if info.is_wrapped {
2358 return Err(CompileError::Parse {
2359 loc: loc.clone(),
2360 kind: ParseError::NestedAssertNotSupported,
2361 });
2362 }
2363 }
2364 }
2365
2366 crate::parser::parse_expression_from_tokens_ref(
2368 tokens.to_vec(),
2369 self.source.interner(),
2370 self.source.files(),
2371 &self.typedefs,
2372 )
2373 }
2374
2375 fn skip_to_macro_end(&mut self, target_marker_id: TokenId) -> Result<()> {
2380 loop {
2382 let token = self.source.next_token()?;
2384
2385 match &token.kind {
2386 TokenKind::MacroEnd(info) if info.begin_marker_id == target_marker_id => {
2387 self.current = self.inner_next_token()?;
2390 return Ok(());
2391 }
2392 TokenKind::Eof => {
2393 return Err(CompileError::Parse {
2394 loc: token.loc.clone(),
2395 kind: ParseError::MacroEndNotFound,
2396 });
2397 }
2398 _ => {
2399 continue;
2401 }
2402 }
2403 }
2404 }
2405
2406 fn inner_next_token(&mut self) -> Result<Token> {
2417 loop {
2418 let token = self.source.next_token()?;
2419
2420 if !self.handle_macro_markers {
2421 return Ok(token);
2422 }
2423
2424 match &token.kind {
2425 TokenKind::MacroBegin(info) => {
2426 if info.is_wrapped {
2427 return Ok(token);
2430 }
2431 if info.preserve_call {
2432 return Ok(token);
2435 }
2436 self.macro_ctx.push((**info).clone());
2438 continue; }
2440 TokenKind::MacroEnd(_info) => {
2441 self.macro_ctx.pop();
2443 continue; }
2445 _ => return Ok(token),
2446 }
2447 }
2448 }
2449
2450 fn advance(&mut self) -> Result<Token> {
2451 let next = self.inner_next_token()?;
2452 let old = std::mem::replace(&mut self.current, next);
2453 Ok(old)
2454 }
2455
2456 pub fn make_node_info(&self, loc: SourceLocation) -> NodeInfo {
2458 match self.macro_ctx.build_macro_info(self.source.interner()) {
2459 Some(macro_info) => NodeInfo::with_macro_info(loc, macro_info),
2460 None => NodeInfo::new(loc),
2461 }
2462 }
2463
2464 pub fn is_in_macro(&self) -> bool {
2466 self.macro_ctx.is_in_macro()
2467 }
2468
2469 pub fn macro_depth(&self) -> usize {
2471 self.macro_ctx.depth()
2472 }
2473
2474 fn expect(&mut self, kind: &TokenKind) -> Result<Token> {
2475 if self.check(kind) {
2476 self.advance()
2477 } else {
2478 Err(CompileError::Parse {
2479 loc: self.current.loc.clone(),
2480 kind: ParseError::UnexpectedToken {
2481 expected: format!("{:?}", kind),
2482 found: self.current.kind.clone(),
2483 },
2484 })
2485 }
2486 }
2487
2488 fn expect_ident(&mut self) -> Result<InternedStr> {
2489 if let TokenKind::Ident(id) = self.current.kind {
2490 self.advance()?;
2491 Ok(id)
2492 } else {
2493 Err(CompileError::Parse {
2494 loc: self.current.loc.clone(),
2495 kind: ParseError::UnexpectedToken {
2496 expected: "identifier".to_string(),
2497 found: self.current.kind.clone(),
2498 },
2499 })
2500 }
2501 }
2502
2503 fn check(&self, kind: &TokenKind) -> bool {
2504 std::mem::discriminant(&self.current.kind) == std::mem::discriminant(kind)
2505 }
2506
2507 fn is_eof(&self) -> bool {
2508 matches!(self.current.kind, TokenKind::Eof)
2509 }
2510
2511 fn current_ident(&self) -> Option<InternedStr> {
2512 if let TokenKind::Ident(id) = self.current.kind {
2513 Some(id)
2514 } else {
2515 None
2516 }
2517 }
2518
2519 fn is_type_arg_builtin(&self, name: InternedStr) -> bool {
2521 let s = self.source.interner().get(name);
2522 matches!(s, "offsetof" | "__builtin_offsetof"
2523 | "__builtin_types_compatible_p"
2524 | "__builtin_va_arg"
2525 | "STRUCT_OFFSET")
2526 }
2527
2528 fn parse_builtin_args(&mut self) -> Result<Vec<BuiltinArg>> {
2530 let mut args = Vec::new();
2531 if !self.check(&TokenKind::RParen) {
2532 loop {
2533 if self.is_type_start() {
2534 let type_name = self.parse_type_name()?;
2535 args.push(BuiltinArg::TypeName(Box::new(type_name)));
2536 } else {
2537 let expr = self.parse_assignment_expr()?;
2538 args.push(BuiltinArg::Expr(Box::new(expr)));
2539 }
2540 if !self.check(&TokenKind::Comma) {
2541 break;
2542 }
2543 self.advance()?;
2544 }
2545 }
2546 Ok(args)
2547 }
2548
2549 fn is_type_start(&self) -> bool {
2550 match &self.current.kind {
2551 TokenKind::KwVoid
2553 | TokenKind::KwChar
2554 | TokenKind::KwShort
2555 | TokenKind::KwInt
2556 | TokenKind::KwLong
2557 | TokenKind::KwFloat
2558 | TokenKind::KwDouble
2559 | TokenKind::KwSigned
2560 | TokenKind::KwSigned2
2561 | TokenKind::KwUnsigned
2562 | TokenKind::KwBool
2563 | TokenKind::KwBool2
2564 | TokenKind::KwComplex
2565 | TokenKind::KwFloat16
2566 | TokenKind::KwFloat32
2567 | TokenKind::KwFloat64
2568 | TokenKind::KwFloat128
2569 | TokenKind::KwFloat32x
2570 | TokenKind::KwFloat64x
2571 | TokenKind::KwInt128 => true,
2572 TokenKind::KwConst
2574 | TokenKind::KwConst2
2575 | TokenKind::KwConst3
2576 | TokenKind::KwVolatile
2577 | TokenKind::KwVolatile2
2578 | TokenKind::KwVolatile3
2579 | TokenKind::KwRestrict
2580 | TokenKind::KwRestrict2
2581 | TokenKind::KwRestrict3
2582 | TokenKind::KwAtomic => true,
2583 TokenKind::KwStruct | TokenKind::KwUnion | TokenKind::KwEnum => true,
2585 TokenKind::KwTypeof | TokenKind::KwTypeof2 | TokenKind::KwTypeof3 => true,
2587 TokenKind::Ident(id) => {
2589 self.typedefs.contains(id) || self.detected_type_params.contains(id)
2590 }
2591 _ => false,
2592 }
2593 }
2594
2595 fn is_declaration_start(&self) -> bool {
2596 match &self.current.kind {
2597 TokenKind::KwTypedef
2599 | TokenKind::KwExtern
2600 | TokenKind::KwStatic
2601 | TokenKind::KwAuto
2602 | TokenKind::KwRegister => true,
2603 TokenKind::KwInline | TokenKind::KwInline2 | TokenKind::KwInline3 => true,
2605 TokenKind::KwExtension => true,
2607 TokenKind::KwThreadLocal | TokenKind::KwThread => true,
2609 _ => self.is_type_start(),
2610 }
2611 }
2612
2613 fn try_skip_attribute(&mut self) -> Result<()> {
2615 loop {
2616 match &self.current.kind {
2617 TokenKind::KwAttribute | TokenKind::KwAttribute2 => {
2618 self.skip_attribute()?;
2619 }
2620 TokenKind::KwAsm | TokenKind::KwAsm2 | TokenKind::KwAsm3 => {
2621 self.try_skip_asm_label()?;
2622 }
2623 _ => break,
2624 }
2625 }
2626 Ok(())
2627 }
2628
2629 fn skip_attribute(&mut self) -> Result<()> {
2631 self.advance()?; if !self.check(&TokenKind::LParen) {
2635 return Ok(()); }
2637 self.advance()?;
2638
2639 if !self.check(&TokenKind::LParen) {
2641 self.skip_balanced_parens()?;
2643 return Ok(());
2644 }
2645 self.advance()?;
2646
2647 self.skip_balanced_parens()?;
2649
2650 self.expect(&TokenKind::RParen)?;
2652
2653 Ok(())
2654 }
2655
2656 fn try_skip_asm_label(&mut self) -> Result<()> {
2658 if matches!(
2659 self.current.kind,
2660 TokenKind::KwAsm | TokenKind::KwAsm2 | TokenKind::KwAsm3
2661 ) {
2662 self.advance()?; if self.check(&TokenKind::LParen) {
2664 self.advance()?; self.skip_balanced_parens()?; }
2667 }
2668 Ok(())
2669 }
2670
2671 fn skip_balanced_parens(&mut self) -> Result<()> {
2673 let mut depth = 1;
2674 while depth > 0 {
2675 match &self.current.kind {
2676 TokenKind::LParen => depth += 1,
2677 TokenKind::RParen => depth -= 1,
2678 TokenKind::Eof => {
2679 return Err(CompileError::Parse {
2680 loc: self.current.loc.clone(),
2681 kind: ParseError::UnexpectedToken {
2682 expected: ")".to_string(),
2683 found: TokenKind::Eof,
2684 },
2685 });
2686 }
2687 _ => {}
2688 }
2689 if depth > 0 {
2690 self.advance()?;
2691 }
2692 }
2693 self.advance()?; Ok(())
2695 }
2696}
2697
2698use crate::source::FileRegistry;
2701use crate::token_source::TokenSlice;
2702
2703pub fn parse_expression_from_tokens(
2713 tokens: Vec<Token>,
2714 interner: StringInterner,
2715 files: FileRegistry,
2716 typedefs: HashSet<InternedStr>,
2717) -> Result<Expr> {
2718 let mut source = TokenSlice::new(tokens, interner, files);
2719 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs)?;
2720 parser.parse_expr_only()
2721}
2722
2723pub fn parse_expression_from_tokens_ref(
2735 tokens: Vec<Token>,
2736 interner: &StringInterner,
2737 files: &FileRegistry,
2738 typedefs: &HashSet<InternedStr>,
2739) -> Result<Expr> {
2740 let mut source = TokenSliceRef::new(tokens, interner, files);
2741 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2742 parser.parse_expr_only()
2743}
2744
2745pub fn parse_statement_from_tokens_ref(
2755 tokens: Vec<Token>,
2756 interner: &StringInterner,
2757 files: &FileRegistry,
2758 typedefs: &HashSet<InternedStr>,
2759) -> Result<Stmt> {
2760 let mut source = TokenSliceRef::new(tokens, interner, files);
2761 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2762 parser.parse_stmt_allow_missing_semi()
2763}
2764
2765#[derive(Debug, Clone, Default)]
2767pub struct ParseStats {
2768 pub function_call_count: usize,
2770 pub deref_count: usize,
2772}
2773
2774impl ParseStats {
2775 pub fn has_unsafe_ops(&self) -> bool {
2777 self.function_call_count > 0 || self.deref_count > 0
2778 }
2779}
2780
2781pub fn parse_expression_from_tokens_ref_with_stats(
2795 tokens: Vec<Token>,
2796 interner: &StringInterner,
2797 files: &FileRegistry,
2798 typedefs: &HashSet<InternedStr>,
2799) -> Result<(Expr, ParseStats)> {
2800 let mut source = TokenSliceRef::new(tokens, interner, files);
2801 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2802 let expr = parser.parse_expr_only()?;
2803 let stats = ParseStats {
2804 function_call_count: parser.function_call_count,
2805 deref_count: parser.deref_count,
2806 };
2807 Ok((expr, stats))
2808}
2809
2810pub fn parse_expression_from_tokens_ref_with_generic_params(
2818 tokens: Vec<Token>,
2819 interner: &StringInterner,
2820 files: &FileRegistry,
2821 typedefs: &HashSet<InternedStr>,
2822 generic_params: HashMap<InternedStr, usize>,
2823) -> Result<(Expr, ParseStats, HashSet<InternedStr>)> {
2824 let mut source = TokenSliceRef::new(tokens, interner, files);
2825 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2826 parser.generic_params = generic_params;
2827 let expr = parser.parse_expr_only()?;
2828 let stats = ParseStats {
2829 function_call_count: parser.function_call_count,
2830 deref_count: parser.deref_count,
2831 };
2832 let detected = parser.detected_type_params;
2833 Ok((expr, stats, detected))
2834}
2835
2836pub fn parse_statement_from_tokens_ref_with_stats(
2851 tokens: Vec<Token>,
2852 interner: &StringInterner,
2853 files: &FileRegistry,
2854 typedefs: &HashSet<InternedStr>,
2855) -> Result<(Stmt, ParseStats)> {
2856 let mut source = TokenSliceRef::new(tokens, interner, files);
2857 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2858 let stmt = parser.parse_stmt_allow_missing_semi()?;
2859 let stats = ParseStats {
2860 function_call_count: parser.function_call_count,
2861 deref_count: parser.deref_count,
2862 };
2863 Ok((stmt, stats))
2864}
2865
2866pub fn parse_statement_from_tokens_ref_with_generic_params(
2874 tokens: Vec<Token>,
2875 interner: &StringInterner,
2876 files: &FileRegistry,
2877 typedefs: &HashSet<InternedStr>,
2878 generic_params: HashMap<InternedStr, usize>,
2879) -> Result<(Stmt, ParseStats, HashSet<InternedStr>)> {
2880 let mut source = TokenSliceRef::new(tokens, interner, files);
2881 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2882 parser.generic_params = generic_params;
2883 let stmt = parser.parse_stmt_allow_missing_semi()?;
2884 let stats = ParseStats {
2885 function_call_count: parser.function_call_count,
2886 deref_count: parser.deref_count,
2887 };
2888 let detected = parser.detected_type_params;
2889 Ok((stmt, stats, detected))
2890}
2891
2892pub fn parse_block_items_from_tokens_ref_with_stats(
2900 tokens: Vec<Token>,
2901 interner: &StringInterner,
2902 files: &FileRegistry,
2903 typedefs: &HashSet<InternedStr>,
2904) -> Result<(Vec<BlockItem>, ParseStats)> {
2905 let mut source = TokenSliceRef::new(tokens, interner, files);
2906 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2907 parser.allow_missing_semi = true;
2908 let mut items = Vec::new();
2909 while !parser.check(&TokenKind::Eof) {
2910 items.push(parser.parse_block_item()?);
2911 }
2912 let stats = ParseStats {
2913 function_call_count: parser.function_call_count,
2914 deref_count: parser.deref_count,
2915 };
2916 Ok((items, stats))
2917}
2918
2919pub fn parse_block_items_from_tokens_ref_with_generic_params(
2924 tokens: Vec<Token>,
2925 interner: &StringInterner,
2926 files: &FileRegistry,
2927 typedefs: &HashSet<InternedStr>,
2928 generic_params: HashMap<InternedStr, usize>,
2929) -> Result<(Vec<BlockItem>, ParseStats, HashSet<InternedStr>)> {
2930 let mut source = TokenSliceRef::new(tokens, interner, files);
2931 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2932 parser.allow_missing_semi = true;
2933 parser.generic_params = generic_params;
2934 let mut items = Vec::new();
2935 while !parser.check(&TokenKind::Eof) {
2936 items.push(parser.parse_block_item()?);
2937 }
2938 let stats = ParseStats {
2939 function_call_count: parser.function_call_count,
2940 deref_count: parser.deref_count,
2941 };
2942 let detected = parser.detected_type_params;
2943 Ok((items, stats, detected))
2944}
2945
2946pub fn parse_type_from_string(
2961 type_str: &str,
2962 interner: &StringInterner,
2963 files: &FileRegistry,
2964 typedefs: &HashSet<InternedStr>,
2965) -> Result<TypeName> {
2966 let file_id = FileId::default();
2968
2969 let mut lexer = Lexer::<LookupOnly>::new_readonly(type_str.as_bytes(), file_id, interner);
2971
2972 let mut tokens = Vec::new();
2973 loop {
2974 let token = lexer.next_token()?;
2975 if matches!(token.kind, TokenKind::Eof) {
2976 break;
2977 }
2978 tokens.push(token);
2979 }
2980
2981 let mut source = TokenSliceRef::new(tokens, interner, files);
2983 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2984 parser.parse_type_name()
2985}
2986
2987pub fn parse_struct_members_from_tokens_ref(
2993 mut tokens: Vec<Token>,
2994 interner: &StringInterner,
2995 files: &FileRegistry,
2996 typedefs: &HashSet<InternedStr>,
2997) -> Result<Vec<StructMember>> {
2998 let needs_trailing_semi = tokens
3000 .iter()
3001 .rev()
3002 .find(|t| !matches!(t.kind, TokenKind::Eof))
3003 .is_some_and(|t| !matches!(t.kind, TokenKind::Semi));
3004 if needs_trailing_semi {
3005 let eof = tokens.iter().position(|t| matches!(t.kind, TokenKind::Eof))
3007 .map(|i| tokens.remove(i));
3008 let semi_loc = tokens.last().map(|t| t.loc.clone()).unwrap_or_default();
3009 tokens.push(Token::new(TokenKind::Semi, semi_loc));
3010 if let Some(eof) = eof {
3011 tokens.push(eof);
3012 }
3013 }
3014 let mut source = TokenSliceRef::new(tokens, interner, files);
3015 let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
3016 let mut members = Vec::new();
3017 while !parser.check(&TokenKind::Eof) {
3018 members.push(parser.parse_struct_member()?);
3019 }
3020 Ok(members)
3021}
3022
3023#[cfg(test)]
3024mod tests {
3025 use super::*;
3026 use crate::preprocessor::PPConfig;
3027 use std::io::Write;
3028 use tempfile::NamedTempFile;
3029
3030 fn parse_str(code: &str) -> Result<TranslationUnit> {
3031 let mut file = NamedTempFile::new().unwrap();
3032 file.write_all(code.as_bytes()).unwrap();
3033
3034 let mut pp = Preprocessor::new(PPConfig::default());
3035 pp.add_source_file(file.path())?;
3036
3037 let mut parser = Parser::new(&mut pp)?;
3038 parser.parse()
3039 }
3040
3041 #[test]
3042 fn test_simple_function() {
3043 let tu = parse_str("int main(void) { return 0; }").unwrap();
3044 assert_eq!(tu.decls.len(), 1);
3045 assert!(matches!(tu.decls[0], ExternalDecl::FunctionDef(_)));
3046 }
3047
3048 #[test]
3049 fn test_variable_declaration() {
3050 let tu = parse_str("int x;").unwrap();
3051 assert_eq!(tu.decls.len(), 1);
3052 assert!(matches!(tu.decls[0], ExternalDecl::Declaration(_)));
3053 }
3054
3055 #[test]
3056 fn test_struct_declaration() {
3057 let tu = parse_str("struct Point { int x; int y; };").unwrap();
3058 assert_eq!(tu.decls.len(), 1);
3059 }
3060
3061 #[test]
3062 fn test_typedef() {
3063 let tu = parse_str("typedef int INT; INT x;").unwrap();
3064 assert_eq!(tu.decls.len(), 2);
3065 }
3066
3067 #[test]
3068 fn test_expression() {
3069 let tu = parse_str("int x = 1 + 2 * 3;").unwrap();
3070 assert_eq!(tu.decls.len(), 1);
3071 }
3072}