Skip to main content

libperl_macrogen/
parser.rs

1//! C言語パーサー
2//!
3//! tinyccのparser部分に相当。再帰下降パーサーで実装。
4
5use 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/// マクロ展開コンテキスト
18///
19/// パース中のマクロ展開状態を追跡する。
20/// MacroBegin マーカーを見つけたらプッシュし、MacroEnd を見つけたらポップする。
21#[derive(Debug, Default)]
22pub struct MacroContext {
23    /// 現在のマクロ展開スタック(外側から内側へ)
24    stack: Vec<MacroBeginInfo>,
25}
26
27impl MacroContext {
28    /// 新しいコンテキストを作成
29    pub fn new() -> Self {
30        Self { stack: Vec::new() }
31    }
32
33    /// マクロ展開を開始
34    pub fn push(&mut self, info: MacroBeginInfo) {
35        self.stack.push(info);
36    }
37
38    /// マクロ展開を終了
39    pub fn pop(&mut self) -> Option<MacroBeginInfo> {
40        self.stack.pop()
41    }
42
43    /// 現在マクロ展開中かどうか
44    pub fn is_in_macro(&self) -> bool {
45        !self.stack.is_empty()
46    }
47
48    /// 現在のマクロ展開情報から MacroExpansionInfo を構築
49    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                    // トークン列を文字列に変換
60                    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    /// 展開スタックの深さ
78    pub fn depth(&self) -> usize {
79        self.stack.len()
80    }
81}
82
83/// パーサー
84///
85/// 汎用のトークンソースからC言語をパースする。
86/// `S` は `TokenSource` トレイトを実装する任意の型。
87pub struct Parser<'a, S: TokenSource> {
88    source: &'a mut S,
89    current: Token,
90    /// typedef名のセット
91    typedefs: HashSet<InternedStr>,
92    /// マクロ展開コンテキスト
93    macro_ctx: MacroContext,
94    /// マクロマーカーを処理するか(emit_markers=true の場合に true にする)
95    handle_macro_markers: bool,
96    /// do-while 文の末尾セミコロンを省略可能にするフラグ
97    allow_missing_semi: bool,
98    /// パース中に検出した関数呼び出しの数
99    pub function_call_count: usize,
100    /// パース中に検出したポインタデリファレンスの数
101    pub deref_count: usize,
102    /// マクロ仮引数の辞書(マクロ本体パース時のみ使用)
103    /// key: 仮引数名, value: パラメータインデックス
104    generic_params: HashMap<InternedStr, usize>,
105    /// パース中に型として使用が検出された generic param
106    detected_type_params: HashSet<InternedStr>,
107}
108
109/// Preprocessor 専用の後方互換コンストラクタ
110impl<'a> Parser<'a, Preprocessor> {
111    /// 新しいパーサーを作成(Preprocessor専用)
112    pub fn new(pp: &'a mut Preprocessor) -> Result<Self> {
113        Self::from_source(pp)
114    }
115
116    /// ストリーミング形式でパース
117    ///
118    /// 各宣言をパースするたびにコールバックを呼び出す。
119    /// パースエラーが発生した場合はコールバックを呼ばずにエラーを返す。
120    /// コールバックが `ControlFlow::Break(())` を返した場合はループを終了。
121    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    /// ストリーミング形式でパース(Preprocessor アクセス付き)
138    ///
139    /// `parse_each` と同様だが、コールバックに Preprocessor への可変参照も渡す。
140    /// マクロ呼び出しコールバック(MacroCallWatcher など)にアクセスする場合に使用。
141    /// パースエラーが発生した場合はコールバックを呼ばずにエラーを返す。
142    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
158/// 汎用のトークンソースに対するパーサー実装
159impl<'a, S: TokenSource> Parser<'a, S> {
160    /// トークンソースからパーサーを作成
161    pub fn from_source(source: &'a mut S) -> Result<Self> {
162        // GCC builtin types を事前登録
163        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        // マーカーをスキップして最初のトークンを取得
179        parser.current = parser.inner_next_token()?;
180
181        Ok(parser)
182    }
183
184    /// トークンソースからパーサーを作成(既存のtypedef情報を引き継ぐ)
185    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        // マーカーをスキップして最初のトークンを取得
199        parser.current = parser.inner_next_token()?;
200
201        Ok(parser)
202    }
203
204    /// マクロマーカー処理を有効にする
205    ///
206    /// Note: 既に current にマーカートークンがある場合はスキップする
207    pub fn set_handle_macro_markers(&mut self, enabled: bool) -> Result<()> {
208        self.handle_macro_markers = enabled;
209
210        // 既に current にマーカートークンがある場合はスキップ
211        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    /// StringInterner への参照を取得
232    pub fn interner(&self) -> &crate::intern::StringInterner {
233        self.source.interner()
234    }
235
236    /// typedef名のセットを取得
237    pub fn typedefs(&self) -> &HashSet<InternedStr> {
238        &self.typedefs
239    }
240
241    /// 翻訳単位をパース
242    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    /// 式のみをパース
254    ///
255    /// マクロ本体など、式だけをパースしたい場合に使用
256    pub fn parse_expr_only(&mut self) -> Result<Expr> {
257        self.parse_expr()
258    }
259
260    /// 文をパース(末尾セミコロン省略可能)
261    ///
262    /// マクロ body のパースなど、do-while の末尾セミコロンが
263    /// 省略されている場合に使用する。
264    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    /// 外部宣言をパース
272    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        // 宣言指定子をパース
278        let specs = self.parse_decl_specs()?;
279
280        // ; のみの場合(構造体宣言など)
281        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        // 宣言子をパース
293        let declarator = self.parse_declarator()?;
294
295        // __attribute__ をスキップ
296        self.try_skip_attribute()?;
297
298        // 関数定義かどうかを判定
299        // 関数定義: 宣言子の後に { が来る
300        if self.check(&TokenKind::LBrace) {
301            // 本体パース前のカウントを記録
302            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            // 差分が関数本体のカウント
308            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        // 宣言の続きをパース
324        let mut declarators = Vec::new();
325
326        // 最初の宣言子(初期化子あり)
327        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        // 追加の宣言子
336        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        // GCC拡張: 宣言の最後の __attribute__((...)) をスキップ
349        self.try_skip_attribute()?;
350
351        self.expect(&TokenKind::Semi)?;
352
353        // typedef の場合、名前を登録
354        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    /// 宣言指定子をパース
372    fn parse_decl_specs(&mut self) -> Result<DeclSpecs> {
373        let mut specs = DeclSpecs::default();
374
375        loop {
376            match &self.current.kind {
377                // GCC拡張: __extension__ は無視(TinyCC方式)
378                TokenKind::KwExtension => {
379                    self.advance()?;
380                    continue;
381                }
382                // C11/GCC: _Thread_local, __thread は無視(TinyCC方式)
383                TokenKind::KwThreadLocal | TokenKind::KwThread => {
384                    self.advance()?;
385                    continue;
386                }
387                // ストレージクラス
388                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                // inline
409                TokenKind::KwInline | TokenKind::KwInline2 | TokenKind::KwInline3 => {
410                    specs.is_inline = true;
411                    self.advance()?;
412                }
413                // 型修飾子
414                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                // 型指定子
431                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                // GCC拡張浮動小数点型
476                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                // GCC拡張: 128ビット整数
501                TokenKind::KwInt128 => {
502                    specs.type_specs.push(TypeSpec::Int128);
503                    self.advance()?;
504                }
505                // typeof
506                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                // 構造体・共用体・列挙
514                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                // GCC拡張: __attribute__((...)) をスキップ
524                TokenKind::KwAttribute | TokenKind::KwAttribute2 => {
525                    self.skip_attribute()?;
526                }
527                // typedef名 or 検出済みの generic 型パラメータ
528                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                // それ以外はループ終了
534                _ => break,
535            }
536        }
537
538        Ok(specs)
539    }
540
541    /// 構造体/共用体をパース
542    fn parse_struct_or_union(&mut self, is_struct: bool) -> Result<TypeSpec> {
543        let loc = self.current.loc.clone();
544        self.advance()?; // struct/union
545
546        // GCC拡張: struct __attribute__((...)) name { ... }
547        self.try_skip_attribute()?;
548
549        // 名前(オプション)
550        let name = self.current_ident();
551        if name.is_some() {
552            self.advance()?;
553        }
554
555        // メンバーリスト(オプション)
556        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    /// 構造体メンバーをパース
577    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            // GCC拡張: 宣言子の後の __attribute__ をスキップ
591            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    /// 列挙型をパース
614    fn parse_enum(&mut self) -> Result<TypeSpec> {
615        let loc = self.current.loc.clone();
616        self.advance()?; // enum
617
618        // 名前(オプション)
619        let name = self.current_ident();
620        if name.is_some() {
621            self.advance()?;
622        }
623
624        // 列挙子リスト(オプション)
625        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    /// 宣言子をパース
661    fn parse_declarator(&mut self) -> Result<Declarator> {
662        let loc = self.current.loc.clone();
663        let mut derived = Vec::new();
664
665        // ポインタ
666        while self.check(&TokenKind::Star) {
667            self.advance()?;
668            let qualifiers = self.parse_type_qualifiers()?;
669            derived.push(DerivedDecl::Pointer(qualifiers));
670        }
671
672        // 直接宣言子
673        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    /// 直接宣言子をパース
684    fn parse_direct_declarator(&mut self) -> Result<(Option<InternedStr>, Vec<DerivedDecl>)> {
685        let mut derived = Vec::new();
686
687        // 識別子または ( declarator )
688        let name = if self.check(&TokenKind::LParen) {
689            self.advance()?;
690            let inner = self.parse_declarator()?;
691            self.expect(&TokenKind::RParen)?;
692            // 内側の派生型を先頭に追加
693            derived = inner.derived;
694            inner.name
695        } else if let Some(id) = self.current_ident() {
696            // 識別子(キーワードはTokenKind::Kw*なのでここには来ない)
697            self.advance()?;
698            Some(id)
699        } else {
700            None
701        };
702
703        // 配列・関数の後置修飾
704        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    /// 配列宣言子をパース
718    fn parse_array_declarator(&mut self) -> Result<DerivedDecl> {
719        self.advance()?; // [
720
721        let mut qualifiers = TypeQualifiers::default();
722        let mut is_static = false;
723        let mut is_vla = false;
724
725        // static と型修飾子
726        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        // サイズ式
749        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    /// 関数宣言子をパース
770    fn parse_function_declarator(&mut self) -> Result<DerivedDecl> {
771        self.advance()?; // (
772
773        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            // GCC拡張: パラメータ後の __attribute__((...)) をスキップ
800            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    /// 型修飾子をパース
820    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    /// 初期化子をパース
849    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    /// 指示子列をパース
873    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    /// 型名をパース
899    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    /// 抽象宣言子をパース
910    fn parse_abstract_declarator(&mut self) -> Result<AbstractDeclarator> {
911        let mut derived = Vec::new();
912
913        // ポインタ
914        while self.check(&TokenKind::Star) {
915            self.advance()?;
916            let qualifiers = self.parse_type_qualifiers()?;
917            derived.push(DerivedDecl::Pointer(qualifiers));
918        }
919
920        // 直接抽象宣言子
921        if self.check(&TokenKind::LParen) {
922            // ( abstract-declarator ) または ( parameter-list )
923            // 先読みで判定が必要だが、簡略化のためここでは単純に処理
924            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                // パラメータリストとして処理
931                let params = self.parse_param_list_inner()?;
932                derived.push(DerivedDecl::Function(params));
933            }
934        }
935
936        // 配列・関数の後置修飾
937        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    /// パラメータリストの内部をパース(RParen消費済み前提ではない)
951    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                // 識別子(キーワードはTokenKind::Kw*なのでここには来ない)
978                // typedef名でなければ宣言子
979                if !self.typedefs.contains(&id) {
980                    Some(self.parse_declarator()?)
981                } else {
982                    None
983                }
984            } else {
985                None
986            };
987
988            // GCC拡張: パラメータ後の __attribute__((...)) をスキップ
989            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    // ==================== 文のパース ====================
1009
1010    /// 複合文をパース
1011    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    /// ブロック項目をパース
1026    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    /// 宣言をパース
1035    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            // GCC拡張: 宣言子の後の __attribute__((...)) をスキップ
1058            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        // GCC拡張: 宣言の最後の __attribute__((...)) をスキップ
1075        self.try_skip_attribute()?;
1076
1077        self.expect(&TokenKind::Semi)?;
1078
1079        // typedef の場合、名前を登録
1080        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    /// 文をパース
1098    fn parse_stmt(&mut self) -> Result<Stmt> {
1099        let loc = self.current.loc.clone();
1100
1101        // キーワードに基づく文のパース
1102        match &self.current.kind {
1103            // ラベル文
1104            TokenKind::KwCase => return self.parse_case_stmt(),
1105            TokenKind::KwDefault => return self.parse_default_stmt(),
1106            // 複合文
1107            TokenKind::LBrace => return Ok(Stmt::Compound(self.parse_compound_stmt()?)),
1108            // 制御フロー文
1109            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            // __asm__ 文
1141            TokenKind::KwAsm | TokenKind::KwAsm2 | TokenKind::KwAsm3 => {
1142                return self.parse_asm_stmt();
1143            }
1144            _ => {}
1145        }
1146
1147        // 式文
1148        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        // ラベルのチェック(識別子 : の場合)
1156        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()?; // if
1175        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()?; // switch
1198        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()?; // while
1209        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()?; // do
1220        let body = Box::new(self.parse_stmt()?);
1221        // expect 'while' keyword
1222        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        // allow_missing_semi が true の場合、; は任意
1237        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()?; // for
1251        self.expect(&TokenKind::LParen)?;
1252
1253        // 初期化部
1254        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        // 条件部
1267        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        // 更新部
1275        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()?; // case
1296        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()?; // default
1306        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()?; // asm / __asm / __asm__
1315
1316        // volatile / __volatile__ はスキップ
1317        while matches!(
1318            self.current.kind,
1319            TokenKind::KwVolatile | TokenKind::KwVolatile2 | TokenKind::KwVolatile3
1320        ) {
1321            self.advance()?;
1322        }
1323
1324        // 括弧内をスキップ
1325        self.expect(&TokenKind::LParen)?;
1326        self.skip_balanced_parens()?;
1327
1328        self.expect(&TokenKind::Semi)?;
1329        Ok(Stmt::Asm { loc })
1330    }
1331
1332    // ==================== 式のパース ====================
1333
1334    /// 式をパース(コンマ式を含む)
1335    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    /// 代入式をパース
1355    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    /// 条件式をパース
1391    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    /// 論理OR式をパース
1414    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    /// 論理AND式をパース
1435    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    /// ビットOR式をパース
1456    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    /// ビットXOR式をパース
1477    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    /// ビットAND式をパース
1498    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    /// 等価式をパース
1519    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    /// 関係式をパース
1545    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    /// シフト式をパース
1573    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    /// 加減式をパース
1599    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    /// 乗除式をパース
1625    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    /// キャスト式をパース
1652    fn parse_cast_expr(&mut self) -> Result<Expr> {
1653        // ( type-name ) cast-expression のみをここで処理
1654        // ( expr ) は parse_primary_expr で処理し、postfix操作を許可する
1655        if self.check(&TokenKind::LParen) {
1656            let loc = self.current.loc.clone();
1657            self.advance()?; // (
1658
1659            // 1. 確定的な型名(キーワード/typedef/既検出の generic param)
1660            if self.is_type_start() {
1661                return self.finish_parse_cast_or_compound_lit(loc);
1662            }
1663
1664            // 2. 未検出の generic param → 先読みで判定
1665            if let Some(id) = self.current_ident() {
1666                if self.generic_params.contains_key(&id)
1667                    && self.looks_like_generic_cast()
1668                {
1669                    // 型パラメータとして記録
1670                    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                // GCC拡張: ステートメント式 ({ ... })
1677                let stmt = self.parse_compound_stmt()?;
1678                self.expect(&TokenKind::RParen)?;
1679                // ステートメント式の後もpostfixを許可する
1680                let stmt_expr = Expr::new(ExprKind::StmtExpr(stmt), loc);
1681                return self.parse_postfix_on(stmt_expr);
1682            } else {
1683                // 括弧で囲まれた式 - parse_primary_exprに任せる
1684                // いったん戻してparse_unary_exprに任せる
1685                // 注: ここではadvanceを巻き戻す代わりに、式をパースしてからpostfixを処理
1686                let expr = self.parse_expr()?;
1687                self.expect(&TokenKind::RParen)?;
1688                // postfix操作を許可する(->や.など)
1689                return self.parse_postfix_on(expr);
1690            }
1691        }
1692
1693        self.parse_unary_expr()
1694    }
1695
1696    /// キャスト式または複合リテラルのパースを完了する
1697    ///
1698    /// `parse_cast_expr` で `(` を消費し、current が型名の先頭にある状態で呼ぶ。
1699    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        // 複合リテラルのチェック
1704        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    /// generic param がキャスト式の型として使われているかを先読みで判定
1737    ///
1738    /// 呼び出し時点: current = generic param の Ident
1739    /// TokenSource::next_token + unget_token で先読み
1740    fn looks_like_generic_cast(&mut self) -> bool {
1741        // 先読み1: param の次のトークン
1742        let next1 = match self.source.next_token() {
1743            Ok(t) => t,
1744            Err(_) => return false,
1745        };
1746
1747        let result = match &next1.kind {
1748            // (PARAM *...) — ポインタキャスト
1749            TokenKind::Star => true,
1750
1751            // (PARAM) — 値キャスト候補、後続の文脈で判定
1752            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                // ) の後に式の開始トークンが続くならキャスト
1761                let is_cast = match &next2.kind {
1762                    TokenKind::LParen       // (PARAM)(expr)
1763                    | TokenKind::Ident(_)   // (PARAM)ident
1764                    | TokenKind::IntLit(_) | TokenKind::UIntLit(_)
1765                    | TokenKind::FloatLit(_)
1766                    | TokenKind::StringLit(_) | TokenKind::CharLit(_)
1767                    | TokenKind::Star       // (PARAM)*ptr (deref)
1768                    | TokenKind::Amp        // (PARAM)&x
1769                    | TokenKind::Bang       // (PARAM)!x
1770                    | TokenKind::Tilde      // (PARAM)~x
1771                    | TokenKind::KwSizeof   // (PARAM)sizeof(x)
1772                    => true,
1773
1774                    // (PARAM)-x: 3トークン先読みで判定
1775                    // `-` の次が数値リテラルなら cast (e.g. (T)-1)
1776                    // それ以外なら二項減算 (e.g. (val) - func(...))
1777                    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            // (PARAM + ...) など — 括弧付き式
1802            _ => false,
1803        };
1804
1805        self.source.unget_token(next1);
1806        result
1807    }
1808
1809    /// 既存の式に対してpostfix操作をパース
1810    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    /// 単項式をパース
1884    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()?; // (
1933                    if self.is_type_start() {
1934                        // sizeof(type)
1935                        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                        // sizeof(expr) - 括弧付きの式
1940                        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            // GCC拡張: __extension__ は無視して続行(TinyCC方式)
1957            TokenKind::KwExtension => {
1958                self.advance()?;
1959                self.parse_unary_expr()
1960            }
1961            _ => self.parse_postfix_expr(),
1962        }
1963    }
1964
1965    /// 後置式をパース
1966    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                    // ビルトイン呼び出し判定
1986                    if let ExprKind::Ident(name) = &expr.kind {
1987                        if self.is_type_arg_builtin(*name) {
1988                            let builtin_name = *name;
1989                            self.advance()?; // (
1990                            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                    // 通常の関数呼び出し
2001                    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    /// 一次式をパース
2061    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                // 連続した文字列リテラルを結合 (C の隣接リテラル連結。
2094                // TinyCC parse_mult_str と同方針で primary 解析位置で行う)。
2095                // マクロ本体の解析では `("" s "")` (STR_WITH_LEN /
2096                // ASSERT_IS_LITERAL の literal-only assert イディオム) の
2097                // ように仮引数 Ident が挟まるため Ident も受理し、
2098                // 「Ident 1 個 + 空リテラルのみ」なら意味的に等価なその
2099                // Ident 式へ還元する。それ以外の Ident 混在 (非空リテラル
2100                // との連結や Ident 2 個以上) は従来どおりエラー。
2101                let mut param_ident: Option<InternedStr> = None;
2102                let mut ident_count = 0usize;
2103                loop {
2104                    match &self.current.kind {
2105                        TokenKind::StringLit(s2) => {
2106                            bytes.extend_from_slice(s2);
2107                            self.advance()?;
2108                        }
2109                        TokenKind::Ident(id) => {
2110                            param_ident = Some(*id);
2111                            ident_count += 1;
2112                            self.advance()?;
2113                        }
2114                        _ => break,
2115                    }
2116                }
2117                match (ident_count, param_ident) {
2118                    (0, _) => Ok(Expr::new(ExprKind::StringLit(bytes), loc)),
2119                    (1, Some(id)) if bytes.is_empty() => {
2120                        Ok(Expr::new(ExprKind::Ident(id), loc))
2121                    }
2122                    _ => Err(CompileError::Parse {
2123                        loc,
2124                        kind: ParseError::UnexpectedToken {
2125                            expected: "adjacent string literals (string concatenation \
2126                                       mixing macro parameters with non-empty literals \
2127                                       is unsupported)"
2128                                .to_string(),
2129                            found: self.current.kind.clone(),
2130                        },
2131                    }),
2132                }
2133            }
2134            TokenKind::LParen => {
2135                self.advance()?;
2136                // GCC拡張: ステートメント式 ({ ... })
2137                if self.check(&TokenKind::LBrace) {
2138                    let stmt = self.parse_compound_stmt()?;
2139                    self.expect(&TokenKind::RParen)?;
2140                    Ok(Expr::new(ExprKind::StmtExpr(stmt), loc))
2141                } else {
2142                    let expr = self.parse_expr()?;
2143                    self.expect(&TokenKind::RParen)?;
2144                    Ok(expr)
2145                }
2146            }
2147            TokenKind::MacroBegin(info) if info.is_wrapped => {
2148                // wrapped マクロ(assert 等)を処理
2149                self.parse_wrapped_macro_expr()
2150            }
2151            TokenKind::MacroBegin(info) if info.preserve_call => {
2152                // preserve_call マクロを MacroCall ノードとして処理
2153                self.parse_macro_call_expr()
2154            }
2155            TokenKind::KwGeneric => {
2156                self.advance()?;
2157                self.parse_generic_selection(loc)
2158            }
2159            _ => Err(CompileError::Parse {
2160                loc,
2161                kind: ParseError::UnexpectedToken {
2162                    expected: "primary expression".to_string(),
2163                    found: self.current.kind.clone(),
2164                },
2165            }),
2166        }
2167    }
2168
2169    /// C11 ジェネリック選択 (_Generic) をパースし、選択枝の式へ脱糖する
2170    ///
2171    /// 制御式は未評価オペランド (C11 6.5.1.1) なので AST には残さない。
2172    /// 本来の選択は制御式の型で決まるが、パース段階では型情報が無いため
2173    /// default 枝(無ければ先頭の枝)を採用する。実世界での主用途である
2174    /// glibc の __glibc_const_generic (C23 の const 修飾ジェネリック関数、
2175    /// 全枝が const キャストの有無を除いて同値) ではこの近似で正しい値になる。
2176    fn parse_generic_selection(&mut self, loc: SourceLocation) -> Result<Expr> {
2177        self.expect(&TokenKind::LParen)?;
2178        // 制御式(未評価なので捨てる)
2179        let _controlling = self.parse_assignment_expr()?;
2180
2181        let mut default_expr: Option<Expr> = None;
2182        let mut first_expr: Option<Expr> = None;
2183
2184        while self.check(&TokenKind::Comma) {
2185            self.advance()?;
2186            let is_default = if self.check(&TokenKind::KwDefault) {
2187                self.advance()?;
2188                true
2189            } else {
2190                let _type_name = self.parse_type_name()?;
2191                false
2192            };
2193            self.expect(&TokenKind::Colon)?;
2194            let expr = self.parse_assignment_expr()?;
2195            if is_default {
2196                if default_expr.is_none() {
2197                    default_expr = Some(expr);
2198                }
2199            } else if first_expr.is_none() {
2200                first_expr = Some(expr);
2201            }
2202        }
2203        self.expect(&TokenKind::RParen)?;
2204
2205        default_expr.or(first_expr).ok_or_else(|| CompileError::Parse {
2206            loc,
2207            kind: ParseError::UnexpectedToken {
2208                expected: "generic association".to_string(),
2209                found: self.current.kind.clone(),
2210            },
2211        })
2212    }
2213
2214    /// wrapped マクロ(assert 等)を Assert 式としてパース
2215    ///
2216    /// MacroBegin(is_wrapped=true) から args を取得し、condition をパースして
2217    /// Assert 式を生成する。その後 MacroEnd までスキップ。
2218    ///
2219    /// `assert_` や `__ASSERT_` は末尾カンマ形式で、式の前に付ける修飾子として使用される。
2220    /// 空展開時はカンマがないため、後続の式があれば暗黙的にカンマ式を形成する。
2221    fn parse_wrapped_macro_expr(&mut self) -> Result<Expr> {
2222        let loc = self.current.loc.clone();
2223
2224        // MacroBegin から情報を取得
2225        let (marker_id, macro_name, args) = match &self.current.kind {
2226            TokenKind::MacroBegin(info) if info.is_wrapped => {
2227                let args = match &info.kind {
2228                    MacroInvocationKind::Function { args } => args.clone(),
2229                    MacroInvocationKind::Object => {
2230                        let name = self.source.interner().get(info.macro_name).to_string();
2231                        return Err(CompileError::Parse {
2232                            loc,
2233                            kind: ParseError::AssertNotFunctionMacro { macro_name: name },
2234                        });
2235                    }
2236                };
2237                (info.marker_id, info.macro_name, args)
2238            }
2239            _ => unreachable!("parse_wrapped_macro_expr called without wrapped MacroBegin"),
2240        };
2241
2242        // 引数数チェック(assert は 1 引数)
2243        if args.len() != 1 {
2244            let name = self.source.interner().get(macro_name).to_string();
2245            return Err(CompileError::Parse {
2246                loc,
2247                kind: ParseError::InvalidAssertArgs {
2248                    macro_name: name,
2249                    arg_count: args.len(),
2250                },
2251            });
2252        }
2253
2254        // args[0] から condition をパース
2255        let condition = self.parse_expr_from_tokens(&args[0], &loc)?;
2256
2257        // AssertKind を判定
2258        let macro_name_str = self.source.interner().get(macro_name);
2259        let kind = detect_assert_kind(macro_name_str).unwrap_or(AssertKind::Assert);
2260
2261        // MacroBegin を消費して MacroEnd までスキップ
2262        // 注意: advance() は inner_next_token() を使うため MacroEnd をスキップしてしまう
2263        // そのため、ここでは skip_to_macro_end() を使って直接ソースから読み取る
2264        self.skip_to_macro_end(marker_id)?;
2265
2266        let assert_expr = Expr::new(ExprKind::Assert {
2267            kind,
2268            condition: Box::new(condition),
2269        }, loc.clone());
2270
2271        // 末尾カンマ形式(assert_, __ASSERT_)の場合、後続の式と暗黙的にカンマ式を形成
2272        // 次のトークンが式の開始(別の Assert 含む)であれば結合
2273        if self.is_expression_start() {
2274            // 後続の式をパース(再帰的に Assert もパースされる)
2275            let next_expr = self.parse_assignment_expr()?;
2276            Ok(Expr::new(
2277                ExprKind::Comma {
2278                    lhs: Box::new(assert_expr),
2279                    rhs: Box::new(next_expr),
2280                },
2281                loc,
2282            ))
2283        } else {
2284            Ok(assert_expr)
2285        }
2286    }
2287
2288    /// preserve_call マクロを MacroCall 式としてパース
2289    ///
2290    /// MacroBegin(preserve_call=true) から元の引数を取得し、
2291    /// 展開結果をパースして MacroCall ノードを生成する。
2292    ///
2293    /// MacroCall は元のマクロ呼び出し情報と展開結果を両方保持することで:
2294    /// - 展開結果で型推論を実行
2295    /// - コード生成時にマクロ呼び出し形式で出力可能
2296    fn parse_macro_call_expr(&mut self) -> Result<Expr> {
2297        let loc = self.current.loc.clone();
2298
2299        // MacroBegin から情報を取得
2300        let (marker_id, macro_name, raw_args, call_loc) = match &self.current.kind {
2301            TokenKind::MacroBegin(info) if info.preserve_call => {
2302                let args = match &info.kind {
2303                    MacroInvocationKind::Function { args } => args.clone(),
2304                    MacroInvocationKind::Object => Vec::new(),
2305                };
2306                (info.marker_id, info.macro_name, args, info.call_loc.clone())
2307            }
2308            _ => unreachable!("parse_macro_call_expr called without preserve_call MacroBegin"),
2309        };
2310
2311        // MacroBegin を消費(advance は inner_next_token を使うため MacroEnd もスキップされる可能性がある)
2312        // そのため、ここでは source から直接読み取って展開トークンを収集
2313        let expanded_tokens = self.collect_tokens_until_macro_end(marker_id)?;
2314
2315        // 展開トークンから式をパース
2316        let expanded = if expanded_tokens.is_empty() {
2317            // 空展開の場合は 0 を返す(void 式として扱う)
2318            Expr::new(ExprKind::IntLit(0), loc.clone())
2319        } else {
2320            crate::parser::parse_expression_from_tokens_ref(
2321                expanded_tokens,
2322                self.source.interner(),
2323                self.source.files(),
2324                &self.typedefs,
2325            )?
2326        };
2327
2328        // 元の引数トークン列を式としてパース
2329        let parsed_args: Result<Vec<Expr>> = raw_args.iter()
2330            .map(|arg_tokens| {
2331                if arg_tokens.is_empty() {
2332                    // 空引数の場合
2333                    Ok(Expr::new(ExprKind::IntLit(0), loc.clone()))
2334                } else {
2335                    crate::parser::parse_expression_from_tokens_ref(
2336                        arg_tokens.clone(),
2337                        self.source.interner(),
2338                        self.source.files(),
2339                        &self.typedefs,
2340                    )
2341                }
2342            })
2343            .collect();
2344        let args = parsed_args?;
2345
2346        // current を次のトークンで更新
2347        self.current = self.inner_next_token()?;
2348
2349        Ok(Expr::new(ExprKind::MacroCall {
2350            name: macro_name,
2351            args,
2352            expanded: Box::new(expanded),
2353            call_loc,
2354        }, loc))
2355    }
2356
2357    /// 指定した marker_id に対応する MacroEnd までのトークンを収集
2358    ///
2359    /// source から直接読み取り、MacroBegin/MacroEnd のネストを追跡する。
2360    fn collect_tokens_until_macro_end(&mut self, target_marker_id: TokenId) -> Result<Vec<Token>> {
2361        let mut tokens = Vec::new();
2362        let mut nested_depth = 0;
2363
2364        loop {
2365            let token = self.source.next_token()?;
2366
2367            match &token.kind {
2368                TokenKind::MacroBegin(_) => {
2369                    // ネストされたマクロ展開開始
2370                    nested_depth += 1;
2371                    tokens.push(token);
2372                }
2373                TokenKind::MacroEnd(info) => {
2374                    if nested_depth > 0 {
2375                        // ネストされたマクロ展開終了
2376                        nested_depth -= 1;
2377                        tokens.push(token);
2378                    } else if info.begin_marker_id == target_marker_id {
2379                        // 目標の MacroEnd を見つけた
2380                        return Ok(tokens);
2381                    } else {
2382                        // 異なる MacroEnd(これは起こらないはず)
2383                        tokens.push(token);
2384                    }
2385                }
2386                TokenKind::Eof => {
2387                    return Err(CompileError::Parse {
2388                        loc: token.loc,
2389                        kind: ParseError::UnexpectedToken {
2390                            expected: "MacroEnd".to_string(),
2391                            found: token.kind,
2392                        },
2393                    });
2394                }
2395                _ => {
2396                    tokens.push(token);
2397                }
2398            }
2399        }
2400    }
2401
2402    /// 現在のトークンが式の開始かどうかを判定
2403    fn is_expression_start(&self) -> bool {
2404        match &self.current.kind {
2405            // 式の開始になり得るトークン
2406            TokenKind::Ident(_)
2407            | TokenKind::IntLit(_)
2408            | TokenKind::UIntLit(_)
2409            | TokenKind::FloatLit(_)
2410            | TokenKind::CharLit(_)
2411            | TokenKind::WideCharLit(_)
2412            | TokenKind::StringLit(_)
2413            | TokenKind::WideStringLit(_)
2414            | TokenKind::LParen
2415            | TokenKind::Star      // 間接参照
2416            | TokenKind::Amp       // アドレス取得
2417            | TokenKind::Plus      // 単項プラス
2418            | TokenKind::Minus     // 単項マイナス
2419            | TokenKind::Bang      // 論理否定
2420            | TokenKind::Tilde     // ビット反転
2421            | TokenKind::PlusPlus  // 前置インクリメント
2422            | TokenKind::MinusMinus // 前置デクリメント
2423            | TokenKind::KwSizeof
2424            | TokenKind::KwAlignof
2425            | TokenKind::KwAlignof2
2426            | TokenKind::KwAlignof3
2427            | TokenKind::MacroBegin(_) => true, // 別の Assert も含む
2428            _ => false,
2429        }
2430    }
2431
2432    /// トークン列から式をパース
2433    ///
2434    /// args から取り出したトークン列を一時的なソースとして式をパースする。
2435    /// 入れ子の wrapped マクロがあればエラー。
2436    fn parse_expr_from_tokens(&self, tokens: &[Token], loc: &SourceLocation) -> Result<Expr> {
2437        // 入れ子チェック:tokens 内に wrapped MacroBegin があればエラー
2438        for token in tokens {
2439            if let TokenKind::MacroBegin(info) = &token.kind {
2440                if info.is_wrapped {
2441                    return Err(CompileError::Parse {
2442                        loc: loc.clone(),
2443                        kind: ParseError::NestedAssertNotSupported,
2444                    });
2445                }
2446            }
2447        }
2448
2449        // トークン列から式をパース
2450        crate::parser::parse_expression_from_tokens_ref(
2451            tokens.to_vec(),
2452            self.source.interner(),
2453            self.source.files(),
2454            &self.typedefs,
2455        )
2456    }
2457
2458    /// 指定した marker_id に対応する MacroEnd までスキップ
2459    ///
2460    /// inner_next_token は MacroEnd をスキップするため、
2461    /// ここでは source から直接読み取る。
2462    fn skip_to_macro_end(&mut self, target_marker_id: TokenId) -> Result<()> {
2463        // まず current をチェック(MacroBegin の直後なので通常は MacroEnd ではない)
2464        loop {
2465            // source から直接読み取る(inner_next_token は MacroEnd をスキップするため)
2466            let token = self.source.next_token()?;
2467
2468            match &token.kind {
2469                TokenKind::MacroEnd(info) if info.begin_marker_id == target_marker_id => {
2470                    // 目標の MacroEnd を見つけた
2471                    // current を次のトークンで更新(inner_next_token を使って正常なフローに戻す)
2472                    self.current = self.inner_next_token()?;
2473                    return Ok(());
2474                }
2475                TokenKind::Eof => {
2476                    return Err(CompileError::Parse {
2477                        loc: token.loc.clone(),
2478                        kind: ParseError::MacroEndNotFound,
2479                    });
2480                }
2481                _ => {
2482                    // 他のトークンはスキップ(MacroBegin/MacroEnd 含む)
2483                    continue;
2484                }
2485            }
2486        }
2487    }
2488
2489    // ==================== ユーティリティ ====================
2490
2491    /// 内部トークン取得メソッド(マーカーを透過的に処理)
2492    ///
2493    /// `handle_macro_markers` が true の場合、MacroBegin/MacroEnd マーカーを
2494    /// 処理してスキップし、通常のトークンのみを返す。
2495    /// ただし、以下の MacroBegin はスキップせず返す:
2496    /// - `is_wrapped=true`: assert 等の特殊処理用
2497    /// - `preserve_call=true`: MacroCall ノード生成用
2498    /// 空展開でもこれらの MacroBegin を返し、適切な AST ノードを生成する。
2499    fn inner_next_token(&mut self) -> Result<Token> {
2500        loop {
2501            let token = self.source.next_token()?;
2502
2503            if !self.handle_macro_markers {
2504                return Ok(token);
2505            }
2506
2507            match &token.kind {
2508                TokenKind::MacroBegin(info) => {
2509                    if info.is_wrapped {
2510                        // wrapped マクロ(assert 等)は常に返す
2511                        // 空展開でも Assert ノードとして AST に残す
2512                        return Ok(token);
2513                    }
2514                    if info.preserve_call {
2515                        // preserve_call マクロは常に返す
2516                        // MacroCall ノードとして AST に残す
2517                        return Ok(token);
2518                    }
2519                    // 通常のマクロ展開開始:コンテキストにプッシュ
2520                    self.macro_ctx.push((**info).clone());
2521                    continue; // マーカーはスキップ
2522                }
2523                TokenKind::MacroEnd(_info) => {
2524                    // マクロ展開終了:コンテキストからポップ
2525                    self.macro_ctx.pop();
2526                    continue; // マーカーはスキップ
2527                }
2528                _ => return Ok(token),
2529            }
2530        }
2531    }
2532
2533    fn advance(&mut self) -> Result<Token> {
2534        let next = self.inner_next_token()?;
2535        let old = std::mem::replace(&mut self.current, next);
2536        Ok(old)
2537    }
2538
2539    /// 現在のマクロコンテキストから NodeInfo を作成
2540    pub fn make_node_info(&self, loc: SourceLocation) -> NodeInfo {
2541        match self.macro_ctx.build_macro_info(self.source.interner()) {
2542            Some(macro_info) => NodeInfo::with_macro_info(loc, macro_info),
2543            None => NodeInfo::new(loc),
2544        }
2545    }
2546
2547    /// 現在マクロ展開中かどうか
2548    pub fn is_in_macro(&self) -> bool {
2549        self.macro_ctx.is_in_macro()
2550    }
2551
2552    /// マクロ展開の深さ
2553    pub fn macro_depth(&self) -> usize {
2554        self.macro_ctx.depth()
2555    }
2556
2557    fn expect(&mut self, kind: &TokenKind) -> Result<Token> {
2558        if self.check(kind) {
2559            self.advance()
2560        } else {
2561            Err(CompileError::Parse {
2562                loc: self.current.loc.clone(),
2563                kind: ParseError::UnexpectedToken {
2564                    expected: format!("{:?}", kind),
2565                    found: self.current.kind.clone(),
2566                },
2567            })
2568        }
2569    }
2570
2571    fn expect_ident(&mut self) -> Result<InternedStr> {
2572        if let TokenKind::Ident(id) = self.current.kind {
2573            self.advance()?;
2574            Ok(id)
2575        } else {
2576            Err(CompileError::Parse {
2577                loc: self.current.loc.clone(),
2578                kind: ParseError::UnexpectedToken {
2579                    expected: "identifier".to_string(),
2580                    found: self.current.kind.clone(),
2581                },
2582            })
2583        }
2584    }
2585
2586    fn check(&self, kind: &TokenKind) -> bool {
2587        std::mem::discriminant(&self.current.kind) == std::mem::discriminant(kind)
2588    }
2589
2590    fn is_eof(&self) -> bool {
2591        matches!(self.current.kind, TokenKind::Eof)
2592    }
2593
2594    fn current_ident(&self) -> Option<InternedStr> {
2595        if let TokenKind::Ident(id) = self.current.kind {
2596            Some(id)
2597        } else {
2598            None
2599        }
2600    }
2601
2602    /// 引数に型名を取りうるビルトイン関数名かどうか
2603    fn is_type_arg_builtin(&self, name: InternedStr) -> bool {
2604        let s = self.source.interner().get(name);
2605        matches!(s, "offsetof" | "__builtin_offsetof"
2606                  | "__builtin_types_compatible_p"
2607                  | "__builtin_va_arg"
2608                  | "STRUCT_OFFSET")
2609    }
2610
2611    /// ビルトイン関数の引数をパース(型名と式を自動判定)
2612    fn parse_builtin_args(&mut self) -> Result<Vec<BuiltinArg>> {
2613        let mut args = Vec::new();
2614        if !self.check(&TokenKind::RParen) {
2615            loop {
2616                if self.is_type_start() {
2617                    let type_name = self.parse_type_name()?;
2618                    args.push(BuiltinArg::TypeName(Box::new(type_name)));
2619                } else {
2620                    let expr = self.parse_assignment_expr()?;
2621                    args.push(BuiltinArg::Expr(Box::new(expr)));
2622                }
2623                if !self.check(&TokenKind::Comma) {
2624                    break;
2625                }
2626                self.advance()?;
2627            }
2628        }
2629        Ok(args)
2630    }
2631
2632    fn is_type_start(&self) -> bool {
2633        match &self.current.kind {
2634            // 型指定子キーワード
2635            TokenKind::KwVoid
2636            | TokenKind::KwChar
2637            | TokenKind::KwShort
2638            | TokenKind::KwInt
2639            | TokenKind::KwLong
2640            | TokenKind::KwFloat
2641            | TokenKind::KwDouble
2642            | TokenKind::KwSigned
2643            | TokenKind::KwSigned2
2644            | TokenKind::KwUnsigned
2645            | TokenKind::KwBool
2646            | TokenKind::KwBool2
2647            | TokenKind::KwComplex
2648            | TokenKind::KwFloat16
2649            | TokenKind::KwFloat32
2650            | TokenKind::KwFloat64
2651            | TokenKind::KwFloat128
2652            | TokenKind::KwFloat32x
2653            | TokenKind::KwFloat64x
2654            | TokenKind::KwInt128 => true,
2655            // 型修飾子キーワード
2656            TokenKind::KwConst
2657            | TokenKind::KwConst2
2658            | TokenKind::KwConst3
2659            | TokenKind::KwVolatile
2660            | TokenKind::KwVolatile2
2661            | TokenKind::KwVolatile3
2662            | TokenKind::KwRestrict
2663            | TokenKind::KwRestrict2
2664            | TokenKind::KwRestrict3
2665            | TokenKind::KwAtomic => true,
2666            // 構造体・共用体・列挙
2667            TokenKind::KwStruct | TokenKind::KwUnion | TokenKind::KwEnum => true,
2668            // typeof
2669            TokenKind::KwTypeof | TokenKind::KwTypeof2 | TokenKind::KwTypeof3 => true,
2670            // typedef名 or 検出済みの generic 型パラメータ
2671            TokenKind::Ident(id) => {
2672                self.typedefs.contains(id) || self.detected_type_params.contains(id)
2673            }
2674            _ => false,
2675        }
2676    }
2677
2678    fn is_declaration_start(&self) -> bool {
2679        match &self.current.kind {
2680            // ストレージクラス
2681            TokenKind::KwTypedef
2682            | TokenKind::KwExtern
2683            | TokenKind::KwStatic
2684            | TokenKind::KwAuto
2685            | TokenKind::KwRegister => true,
2686            // inline
2687            TokenKind::KwInline | TokenKind::KwInline2 | TokenKind::KwInline3 => true,
2688            // GCC拡張
2689            TokenKind::KwExtension => true,
2690            // thread-local
2691            TokenKind::KwThreadLocal | TokenKind::KwThread => true,
2692            _ => self.is_type_start(),
2693        }
2694    }
2695
2696    /// __attribute__ / __asm__ があればスキップ(複数連続も対応)
2697    fn try_skip_attribute(&mut self) -> Result<()> {
2698        loop {
2699            match &self.current.kind {
2700                TokenKind::KwAttribute | TokenKind::KwAttribute2 => {
2701                    self.skip_attribute()?;
2702                }
2703                TokenKind::KwAsm | TokenKind::KwAsm2 | TokenKind::KwAsm3 => {
2704                    self.try_skip_asm_label()?;
2705                }
2706                _ => break,
2707            }
2708        }
2709        Ok(())
2710    }
2711
2712    /// GCC拡張: __attribute__((...)) をスキップ
2713    fn skip_attribute(&mut self) -> Result<()> {
2714        self.advance()?; // __attribute__ / __attribute
2715
2716        // 外側の ( を期待
2717        if !self.check(&TokenKind::LParen) {
2718            return Ok(()); // 引数なしの場合
2719        }
2720        self.advance()?;
2721
2722        // 内側の ( を期待
2723        if !self.check(&TokenKind::LParen) {
2724            // 単一括弧の場合もある
2725            self.skip_balanced_parens()?;
2726            return Ok(());
2727        }
2728        self.advance()?;
2729
2730        // 内側の括弧の中身をスキップ
2731        self.skip_balanced_parens()?;
2732
2733        // 外側の ) を期待
2734        self.expect(&TokenKind::RParen)?;
2735
2736        Ok(())
2737    }
2738
2739    /// __asm__(label) があればスキップ
2740    fn try_skip_asm_label(&mut self) -> Result<()> {
2741        if matches!(
2742            self.current.kind,
2743            TokenKind::KwAsm | TokenKind::KwAsm2 | TokenKind::KwAsm3
2744        ) {
2745            self.advance()?; // asm / __asm / __asm__
2746            if self.check(&TokenKind::LParen) {
2747                self.advance()?; // (
2748                self.skip_balanced_parens()?; // 内容をスキップして ) を消費
2749            }
2750        }
2751        Ok(())
2752    }
2753
2754    /// 括弧のバランスを取りながらスキップ
2755    fn skip_balanced_parens(&mut self) -> Result<()> {
2756        let mut depth = 1;
2757        while depth > 0 {
2758            match &self.current.kind {
2759                TokenKind::LParen => depth += 1,
2760                TokenKind::RParen => depth -= 1,
2761                TokenKind::Eof => {
2762                    return Err(CompileError::Parse {
2763                        loc: self.current.loc.clone(),
2764                        kind: ParseError::UnexpectedToken {
2765                            expected: ")".to_string(),
2766                            found: TokenKind::Eof,
2767                        },
2768                    });
2769                }
2770                _ => {}
2771            }
2772            if depth > 0 {
2773                self.advance()?;
2774            }
2775        }
2776        self.advance()?; // 最後の )
2777        Ok(())
2778    }
2779}
2780
2781// ==================== ヘルパー関数 ====================
2782
2783use crate::source::FileRegistry;
2784use crate::token_source::TokenSlice;
2785
2786/// トークン列から式をパース
2787///
2788/// マクロ本体などのトークン列を式としてパースする際に使用。
2789///
2790/// # Arguments
2791/// * `tokens` - パースするトークン列
2792/// * `interner` - 文字列インターナー
2793/// * `files` - ファイルレジストリ
2794/// * `typedefs` - typedef名のセット(キャスト式の型名判定に使用)
2795pub fn parse_expression_from_tokens(
2796    tokens: Vec<Token>,
2797    interner: StringInterner,
2798    files: FileRegistry,
2799    typedefs: HashSet<InternedStr>,
2800) -> Result<Expr> {
2801    let mut source = TokenSlice::new(tokens, interner, files);
2802    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs)?;
2803    parser.parse_expr_only()
2804}
2805
2806/// トークン列から式をパース(参照ベース版)
2807///
2808/// `parse_expression_from_tokens` の参照ベース版。
2809/// interner, files, typedefs をクローンせずに借用することで、
2810/// 高頻度の呼び出し時のオーバーヘッドを削減する。
2811///
2812/// # Arguments
2813/// * `tokens` - パースするトークン列
2814/// * `interner` - 文字列インターナーへの参照
2815/// * `files` - ファイルレジストリへの参照
2816/// * `typedefs` - typedef名のセットへの参照
2817pub fn parse_expression_from_tokens_ref(
2818    tokens: Vec<Token>,
2819    interner: &StringInterner,
2820    files: &FileRegistry,
2821    typedefs: &HashSet<InternedStr>,
2822) -> Result<Expr> {
2823    let mut source = TokenSliceRef::new(tokens, interner, files);
2824    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2825    parser.parse_expr_only()
2826}
2827
2828/// トークン列を文としてパース(参照ベース版)
2829///
2830/// マクロ body のパースに使用。do-while の末尾セミコロンは省略可能。
2831///
2832/// # Arguments
2833/// * `tokens` - パースするトークン列
2834/// * `interner` - 文字列インターナーへの参照
2835/// * `files` - ファイルレジストリへの参照
2836/// * `typedefs` - typedef名のセットへの参照
2837pub fn parse_statement_from_tokens_ref(
2838    tokens: Vec<Token>,
2839    interner: &StringInterner,
2840    files: &FileRegistry,
2841    typedefs: &HashSet<InternedStr>,
2842) -> Result<Stmt> {
2843    let mut source = TokenSliceRef::new(tokens, interner, files);
2844    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2845    parser.parse_stmt_allow_missing_semi()
2846}
2847
2848/// パース結果に付随する統計情報
2849#[derive(Debug, Clone, Default)]
2850pub struct ParseStats {
2851    /// 関数呼び出しの数
2852    pub function_call_count: usize,
2853    /// ポインタデリファレンスの数
2854    pub deref_count: usize,
2855}
2856
2857impl ParseStats {
2858    /// unsafe 操作を含むか
2859    pub fn has_unsafe_ops(&self) -> bool {
2860        self.function_call_count > 0 || self.deref_count > 0
2861    }
2862}
2863
2864/// トークン列から式をパース(統計情報付き・参照ベース版)
2865///
2866/// `parse_expression_from_tokens_ref` と同様だが、
2867/// パース統計(関数呼び出し数など)も返す。
2868///
2869/// # Arguments
2870/// * `tokens` - パースするトークン列
2871/// * `interner` - 文字列インターナーへの参照
2872/// * `files` - ファイルレジストリへの参照
2873/// * `typedefs` - typedef名のセットへの参照
2874///
2875/// # Returns
2876/// (パースされた式, 統計情報)
2877pub fn parse_expression_from_tokens_ref_with_stats(
2878    tokens: Vec<Token>,
2879    interner: &StringInterner,
2880    files: &FileRegistry,
2881    typedefs: &HashSet<InternedStr>,
2882) -> Result<(Expr, ParseStats)> {
2883    let mut source = TokenSliceRef::new(tokens, interner, files);
2884    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2885    let expr = parser.parse_expr_only()?;
2886    let stats = ParseStats {
2887        function_call_count: parser.function_call_count,
2888        deref_count: parser.deref_count,
2889    };
2890    Ok((expr, stats))
2891}
2892
2893/// トークン列から式をパース(generic_params 付き)
2894///
2895/// マクロ本体のパースに使用。マクロの仮引数名を generic_params として渡し、
2896/// キャスト式での型パラメータ使用を自動検出する。
2897///
2898/// # Returns
2899/// (パースされた式, 統計情報, 検出された型パラメータ)
2900pub fn parse_expression_from_tokens_ref_with_generic_params(
2901    tokens: Vec<Token>,
2902    interner: &StringInterner,
2903    files: &FileRegistry,
2904    typedefs: &HashSet<InternedStr>,
2905    generic_params: HashMap<InternedStr, usize>,
2906) -> Result<(Expr, ParseStats, HashSet<InternedStr>)> {
2907    let mut source = TokenSliceRef::new(tokens, interner, files);
2908    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2909    parser.generic_params = generic_params;
2910    let expr = parser.parse_expr_only()?;
2911    let stats = ParseStats {
2912        function_call_count: parser.function_call_count,
2913        deref_count: parser.deref_count,
2914    };
2915    let detected = parser.detected_type_params;
2916    Ok((expr, stats, detected))
2917}
2918
2919/// トークン列を文としてパース(統計情報付き・参照ベース版)
2920///
2921/// `parse_statement_from_tokens_ref` と同様だが、
2922/// パース統計(関数呼び出し数など)も返す。
2923/// do-while の末尾セミコロンは省略可能。
2924///
2925/// # Arguments
2926/// * `tokens` - パースするトークン列
2927/// * `interner` - 文字列インターナーへの参照
2928/// * `files` - ファイルレジストリへの参照
2929/// * `typedefs` - typedef名のセットへの参照
2930///
2931/// # Returns
2932/// (パースされた文, 統計情報)
2933pub fn parse_statement_from_tokens_ref_with_stats(
2934    tokens: Vec<Token>,
2935    interner: &StringInterner,
2936    files: &FileRegistry,
2937    typedefs: &HashSet<InternedStr>,
2938) -> Result<(Stmt, ParseStats)> {
2939    let mut source = TokenSliceRef::new(tokens, interner, files);
2940    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2941    let stmt = parser.parse_stmt_allow_missing_semi()?;
2942    let stats = ParseStats {
2943        function_call_count: parser.function_call_count,
2944        deref_count: parser.deref_count,
2945    };
2946    Ok((stmt, stats))
2947}
2948
2949/// トークン列を文としてパース(generic_params 付き)
2950///
2951/// マクロ本体のパースに使用。マクロの仮引数名を generic_params として渡し、
2952/// キャスト式での型パラメータ使用を自動検出する。
2953///
2954/// # Returns
2955/// (パースされた文, 統計情報, 検出された型パラメータ)
2956pub fn parse_statement_from_tokens_ref_with_generic_params(
2957    tokens: Vec<Token>,
2958    interner: &StringInterner,
2959    files: &FileRegistry,
2960    typedefs: &HashSet<InternedStr>,
2961    generic_params: HashMap<InternedStr, usize>,
2962) -> Result<(Stmt, ParseStats, HashSet<InternedStr>)> {
2963    let mut source = TokenSliceRef::new(tokens, interner, files);
2964    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2965    parser.generic_params = generic_params;
2966    let stmt = parser.parse_stmt_allow_missing_semi()?;
2967    let stats = ParseStats {
2968        function_call_count: parser.function_call_count,
2969        deref_count: parser.deref_count,
2970    };
2971    let detected = parser.detected_type_params;
2972    Ok((stmt, stats, detected))
2973}
2974
2975/// トークン列を複数のブロック項目としてパース
2976///
2977/// セミコロン区切りの複数文を含むマクロ本体のパースに使用。
2978/// `{ }` なしの BlockItem リストをパースし、EOF まで読む。
2979///
2980/// # Returns
2981/// (パースされたブロック項目リスト, 統計情報)
2982pub fn parse_block_items_from_tokens_ref_with_stats(
2983    tokens: Vec<Token>,
2984    interner: &StringInterner,
2985    files: &FileRegistry,
2986    typedefs: &HashSet<InternedStr>,
2987) -> Result<(Vec<BlockItem>, ParseStats)> {
2988    let mut source = TokenSliceRef::new(tokens, interner, files);
2989    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
2990    parser.allow_missing_semi = true;
2991    let mut items = Vec::new();
2992    while !parser.check(&TokenKind::Eof) {
2993        items.push(parser.parse_block_item()?);
2994    }
2995    let stats = ParseStats {
2996        function_call_count: parser.function_call_count,
2997        deref_count: parser.deref_count,
2998    };
2999    Ok((items, stats))
3000}
3001
3002/// トークン列を複数のブロック項目としてパース(generic_params 付き)
3003///
3004/// # Returns
3005/// (パースされたブロック項目リスト, 統計情報, 検出された型パラメータ)
3006pub fn parse_block_items_from_tokens_ref_with_generic_params(
3007    tokens: Vec<Token>,
3008    interner: &StringInterner,
3009    files: &FileRegistry,
3010    typedefs: &HashSet<InternedStr>,
3011    generic_params: HashMap<InternedStr, usize>,
3012) -> Result<(Vec<BlockItem>, ParseStats, HashSet<InternedStr>)> {
3013    let mut source = TokenSliceRef::new(tokens, interner, files);
3014    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
3015    parser.allow_missing_semi = true;
3016    parser.generic_params = generic_params;
3017    let mut items = Vec::new();
3018    while !parser.check(&TokenKind::Eof) {
3019        items.push(parser.parse_block_item()?);
3020    }
3021    let stats = ParseStats {
3022        function_call_count: parser.function_call_count,
3023        deref_count: parser.deref_count,
3024    };
3025    let detected = parser.detected_type_params;
3026    Ok((items, stats, detected))
3027}
3028
3029/// 型文字列から TypeName をパース
3030///
3031/// apidoc 等の型文字列(例: "SV *", "const char *")をパースして
3032/// TypeName AST を返す。ReadOnlyLexer を使用するため、
3033/// 型文字列内の識別子は既に intern 済みである必要がある。
3034///
3035/// # Arguments
3036/// * `type_str` - パースする型文字列
3037/// * `interner` - 文字列インターナーへの参照(読み取り専用)
3038/// * `files` - ファイルレジストリへの参照
3039/// * `typedefs` - typedef名のセットへの参照
3040///
3041/// # Returns
3042/// パースされた TypeName AST、または識別子が未知の場合はエラー
3043pub fn parse_type_from_string(
3044    type_str: &str,
3045    interner: &StringInterner,
3046    files: &FileRegistry,
3047    typedefs: &HashSet<InternedStr>,
3048) -> Result<TypeName> {
3049    // 型文字列用のダミー FileId(エラー時の位置情報は限定的)
3050    let file_id = FileId::default();
3051
3052    // ReadOnlyLexer でトークン化(新規 intern なし)
3053    let mut lexer = Lexer::<LookupOnly>::new_readonly(type_str.as_bytes(), file_id, interner);
3054
3055    let mut tokens = Vec::new();
3056    loop {
3057        let token = lexer.next_token()?;
3058        if matches!(token.kind, TokenKind::Eof) {
3059            break;
3060        }
3061        tokens.push(token);
3062    }
3063
3064    // パース
3065    let mut source = TokenSliceRef::new(tokens, interner, files);
3066    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
3067    parser.parse_type_name()
3068}
3069
3070/// トークン列を struct メンバー宣言の連続としてパースする。
3071///
3072/// `_XPVCV_COMMON` のような共通フィールド宣言マクロの本体を解析する用途。
3073/// 入力末尾に `;` が無い場合は自動補完する(マクロ本体は典型的に最終
3074/// 宣言の後に `;` を持たない — 展開先で `;` が補われる)。
3075pub fn parse_struct_members_from_tokens_ref(
3076    mut tokens: Vec<Token>,
3077    interner: &StringInterner,
3078    files: &FileRegistry,
3079    typedefs: &HashSet<InternedStr>,
3080) -> Result<Vec<StructMember>> {
3081    // 末尾に `;` が無ければ補う(最後の意味のあるトークンを見て判定)
3082    let needs_trailing_semi = tokens
3083        .iter()
3084        .rev()
3085        .find(|t| !matches!(t.kind, TokenKind::Eof))
3086        .is_some_and(|t| !matches!(t.kind, TokenKind::Semi));
3087    if needs_trailing_semi {
3088        // EOF を取り除いて `;` を足し直す
3089        let eof = tokens.iter().position(|t| matches!(t.kind, TokenKind::Eof))
3090            .map(|i| tokens.remove(i));
3091        let semi_loc = tokens.last().map(|t| t.loc.clone()).unwrap_or_default();
3092        tokens.push(Token::new(TokenKind::Semi, semi_loc));
3093        if let Some(eof) = eof {
3094            tokens.push(eof);
3095        }
3096    }
3097    let mut source = TokenSliceRef::new(tokens, interner, files);
3098    let mut parser = Parser::from_source_with_typedefs(&mut source, typedefs.clone())?;
3099    let mut members = Vec::new();
3100    while !parser.check(&TokenKind::Eof) {
3101        members.push(parser.parse_struct_member()?);
3102    }
3103    Ok(members)
3104}
3105
3106#[cfg(test)]
3107mod tests {
3108    use super::*;
3109    use crate::preprocessor::PPConfig;
3110    use std::io::Write;
3111    use tempfile::NamedTempFile;
3112
3113    fn parse_str(code: &str) -> Result<TranslationUnit> {
3114        let mut file = NamedTempFile::new().unwrap();
3115        file.write_all(code.as_bytes()).unwrap();
3116
3117        let mut pp = Preprocessor::new(PPConfig::default());
3118        pp.add_source_file(file.path())?;
3119
3120        let mut parser = Parser::new(&mut pp)?;
3121        parser.parse()
3122    }
3123
3124    #[test]
3125    fn test_simple_function() {
3126        let tu = parse_str("int main(void) { return 0; }").unwrap();
3127        assert_eq!(tu.decls.len(), 1);
3128        assert!(matches!(tu.decls[0], ExternalDecl::FunctionDef(_)));
3129    }
3130
3131    #[test]
3132    fn test_variable_declaration() {
3133        let tu = parse_str("int x;").unwrap();
3134        assert_eq!(tu.decls.len(), 1);
3135        assert!(matches!(tu.decls[0], ExternalDecl::Declaration(_)));
3136    }
3137
3138    #[test]
3139    fn test_struct_declaration() {
3140        let tu = parse_str("struct Point { int x; int y; };").unwrap();
3141        assert_eq!(tu.decls.len(), 1);
3142    }
3143
3144    #[test]
3145    fn test_typedef() {
3146        let tu = parse_str("typedef int INT; INT x;").unwrap();
3147        assert_eq!(tu.decls.len(), 2);
3148    }
3149
3150    #[test]
3151    fn test_expression() {
3152        let tu = parse_str("int x = 1 + 2 * 3;").unwrap();
3153        assert_eq!(tu.decls.len(), 1);
3154    }
3155}