Skip to content

Commit f45dc0d

Browse files
committed
Prepared C AST translation to support C function definitions
1 parent f19acd5 commit f45dc0d

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

Diff for: src/c/ast/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ pub struct FunctionDefinition {
477477
pub attributes: Vec<Attribute>,
478478
pub declaration_specifiers: DeclarationSpecifiers,
479479
pub declarator: Declarator,
480+
pub parameter_type_list: ParameterTypeList,
480481
pub body: CompoundStatement,
481482
}
482483

Diff for: src/c/parser/mod.rs

+27-1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ impl<'a> Parser<'a> {
110110
&declaration.declaration_specifiers,
111111
declarator,
112112
parameter_type_list,
113+
None,
113114
self.diagnostics,
114115
self.c_file_type,
115116
)?;
@@ -120,7 +121,19 @@ impl<'a> Parser<'a> {
120121
Declaration::StaticAssert(_) => todo!("c static assert"),
121122
Declaration::Attribute(_) => todo!("c attribute declaration"),
122123
},
123-
ExternalDeclaration::FunctionDefinition(_) => todo!("define c function"),
124+
ExternalDeclaration::FunctionDefinition(function_definition) => {
125+
declare_function(
126+
&mut self.typedefs,
127+
&mut ast_file,
128+
&function_definition.attributes,
129+
&function_definition.declaration_specifiers,
130+
&function_definition.declarator,
131+
&function_definition.parameter_type_list,
132+
Some(function_definition.body),
133+
self.diagnostics,
134+
self.c_file_type,
135+
)?;
136+
}
124137
}
125138
}
126139

@@ -141,10 +154,23 @@ impl<'a> Parser<'a> {
141154
let declarator = self.parse_declarator()?;
142155
let body = self.parse_function_body()?;
143156

157+
let (declarator, parameter_type_list) = match declarator.kind {
158+
DeclaratorKind::Function(declarator, parameter_type_list) => {
159+
(*declarator, parameter_type_list)
160+
}
161+
_ => {
162+
return Err(ParseError::message(
163+
"Invalid function definition",
164+
declarator.source,
165+
))
166+
}
167+
};
168+
144169
Ok(FunctionDefinition {
145170
attributes,
146171
declaration_specifiers,
147172
declarator,
173+
parameter_type_list,
148174
body,
149175
})
150176
}

Diff for: src/c/translation/function.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use crate::{
44
ast::{self, AstFile, Func, FuncHead, Param, Params},
55
c::{
66
ast::{
7-
Attribute, CTypedef, DeclarationSpecifiers, Declarator, ParameterDeclarationCore,
8-
ParameterTypeList, StorageClassSpecifier,
7+
Attribute, CTypedef, CompoundStatement, DeclarationSpecifiers, Declarator,
8+
ParameterDeclarationCore, ParameterTypeList, StorageClassSpecifier,
99
},
1010
parser::{error::ParseErrorKind, ParseError},
1111
},
@@ -21,6 +21,7 @@ pub fn declare_function(
2121
declaration_specifiers: &DeclarationSpecifiers,
2222
declarator: &Declarator,
2323
parameter_type_list: &ParameterTypeList,
24+
body: Option<CompoundStatement>,
2425
diagnostics: &Diagnostics,
2526
c_file_type: CFileType,
2627
) -> Result<(), ParseError> {

0 commit comments

Comments
 (0)