mirror of
https://github.com/Noratrieb/uwucc.git
synced 2026-01-16 17:45:11 +01:00
funny ints
This commit is contained in:
parent
c519241bd4
commit
8093f87fc3
9 changed files with 825 additions and 58 deletions
|
|
@ -121,20 +121,40 @@ pub enum Stmt {
|
||||||
// --- Types and decls and garbage whatever
|
// --- Types and decls and garbage whatever
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#[derive(Debug, DebugPls)]
|
||||||
|
pub enum IntTySignedness {
|
||||||
|
Signed,
|
||||||
|
Unsigned,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for IntTySignedness {
|
||||||
|
fn default() -> Self {
|
||||||
|
// C defaults to unsigned for integers.
|
||||||
|
Self::Signed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, DebugPls)]
|
||||||
|
pub enum IntTyKind {
|
||||||
|
Short,
|
||||||
|
Int,
|
||||||
|
Long,
|
||||||
|
LongLong,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, DebugPls)]
|
||||||
|
pub struct IntTy {
|
||||||
|
pub sign: IntTySignedness,
|
||||||
|
pub kind: IntTyKind,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, DebugPls)]
|
#[derive(Debug, DebugPls)]
|
||||||
pub enum TypeSpecifier {
|
pub enum TypeSpecifier {
|
||||||
Void,
|
Void,
|
||||||
Char,
|
Char,
|
||||||
SChar,
|
SChar,
|
||||||
UChar,
|
UChar,
|
||||||
Short,
|
Integer(IntTy),
|
||||||
UShort,
|
|
||||||
Int,
|
|
||||||
UInt,
|
|
||||||
Long,
|
|
||||||
ULong,
|
|
||||||
LongLong,
|
|
||||||
ULongLong,
|
|
||||||
Float,
|
Float,
|
||||||
Double,
|
Double,
|
||||||
LongDouble,
|
LongDouble,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,8 @@ use peekmore::PeekMoreIterator;
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{
|
ast::{
|
||||||
Decl, DeclAttr, DeclSpec, Declarator, DirectDeclarator, ExternalDecl, FunctionDef,
|
Decl, DeclAttr, DeclSpec, Declarator, DirectDeclarator, ExternalDecl, FunctionDef,
|
||||||
FunctionParamDecl, Ident, InitDecl, NormalDecl, TypeSpecifier,
|
FunctionParamDecl, Ident, InitDecl, IntTy, IntTyKind, IntTySignedness, NormalDecl,
|
||||||
|
TypeSpecifier,
|
||||||
},
|
},
|
||||||
pre::Punctuator as Punct,
|
pre::Punctuator as Punct,
|
||||||
token::{Keyword as Kw, Token as Tok},
|
token::{Keyword as Kw, Token as Tok},
|
||||||
|
|
@ -282,27 +283,92 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_specifier(&mut self) -> Result<Spanned<TypeSpecifier>> {
|
fn type_specifier(&mut self) -> Result<Spanned<TypeSpecifier>> {
|
||||||
let (token, span) = self.next_t()?;
|
// todo: less shit code and better span handling
|
||||||
let ty = match token {
|
let mut signedness = None;
|
||||||
Tok::Kw(Kw::Void) => TypeSpecifier::Void,
|
|
||||||
Tok::Kw(Kw::Char) => TypeSpecifier::Char,
|
loop {
|
||||||
Tok::Kw(Kw::Short) => TypeSpecifier::Short,
|
let (token, span) = self.next_t()?;
|
||||||
Tok::Kw(Kw::Int) => TypeSpecifier::Int,
|
let ty = match token {
|
||||||
Tok::Kw(Kw::Long) => TypeSpecifier::Long,
|
Tok::Kw(Kw::Void) => TypeSpecifier::Void,
|
||||||
Tok::Kw(Kw::Float) => TypeSpecifier::Float,
|
Tok::Kw(Kw::Char) => match signedness {
|
||||||
Tok::Kw(Kw::Double) => TypeSpecifier::Double,
|
Some(IntTySignedness::Signed) => TypeSpecifier::SChar,
|
||||||
Tok::Kw(Kw::Signed) => TypeSpecifier::Int,
|
Some(IntTySignedness::Unsigned) => TypeSpecifier::UChar,
|
||||||
Tok::Kw(Kw::Unsigned) => TypeSpecifier::UInt,
|
None => TypeSpecifier::Char,
|
||||||
Tok::Kw(Kw::Bool) => TypeSpecifier::Bool,
|
},
|
||||||
Tok::Kw(Kw::Complex) => {
|
Tok::Kw(Kw::Short) => {
|
||||||
return Err(ParserError::new(
|
eat!(self, Tok::Kw(Kw::Int));
|
||||||
span,
|
TypeSpecifier::Integer(IntTy {
|
||||||
"tf are you doing with complex numbers".to_string(),
|
sign: signedness.unwrap_or_default(),
|
||||||
))
|
kind: IntTyKind::Short,
|
||||||
}
|
})
|
||||||
tok => return Err(ParserError::new(span, format!("Invalid token: `{tok}`"))),
|
}
|
||||||
};
|
Tok::Kw(Kw::Int) => TypeSpecifier::Integer(IntTy {
|
||||||
Ok((ty, span))
|
sign: signedness.unwrap_or_default(),
|
||||||
|
kind: IntTyKind::Int,
|
||||||
|
}),
|
||||||
|
Tok::Kw(Kw::Long) => {
|
||||||
|
if let Some(_) = eat!(self, Tok::Kw(Kw::Long)) {
|
||||||
|
eat!(self, Tok::Kw(Kw::Int));
|
||||||
|
TypeSpecifier::Integer(IntTy {
|
||||||
|
sign: signedness.unwrap_or_default(),
|
||||||
|
kind: IntTyKind::LongLong,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
eat!(self, Tok::Kw(Kw::Int));
|
||||||
|
TypeSpecifier::Integer(IntTy {
|
||||||
|
sign: signedness.unwrap_or_default(),
|
||||||
|
kind: IntTyKind::Long,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Tok::Kw(Kw::Signed) => {
|
||||||
|
if signedness.is_some() {
|
||||||
|
return Err(ParserError::new(
|
||||||
|
span,
|
||||||
|
"cannot specify signedness twice".to_string(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if let Ok((Tok::Kw(Kw::Char | Kw::Short| Kw::Int | Kw::Long), _)) = self.peek_t() {
|
||||||
|
// the signed is an integer qualifier
|
||||||
|
signedness = Some(IntTySignedness::Signed);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
TypeSpecifier::Integer(IntTy {
|
||||||
|
sign: IntTySignedness::Signed,
|
||||||
|
kind: IntTyKind::Int,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Tok::Kw(Kw::Unsigned) => {
|
||||||
|
if signedness.is_some() {
|
||||||
|
return Err(ParserError::new(
|
||||||
|
span,
|
||||||
|
"cannot specify signedness twice".to_string(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if let Ok((Tok::Kw(Kw::Char | Kw::Short| Kw::Int | Kw::Long), _)) = self.peek_t() {
|
||||||
|
// the unsigned is an integer qualifier
|
||||||
|
signedness = Some(IntTySignedness::Unsigned);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
TypeSpecifier::Integer(IntTy {
|
||||||
|
sign: IntTySignedness::Unsigned,
|
||||||
|
kind: IntTyKind::Int,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Tok::Kw(Kw::Float) => TypeSpecifier::Float,
|
||||||
|
Tok::Kw(Kw::Double) => TypeSpecifier::Double,
|
||||||
|
Tok::Kw(Kw::Bool) => TypeSpecifier::Bool,
|
||||||
|
Tok::Kw(Kw::Complex) => {
|
||||||
|
return Err(ParserError::new(
|
||||||
|
span,
|
||||||
|
"tf are you doing with complex numbers".to_string(),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
tok => return Err(ParserError::new(span, format!("Invalid token: `{tok}`"))),
|
||||||
|
};
|
||||||
|
|
||||||
|
break Ok((ty, span));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// (6.7.6) declarator:
|
/// (6.7.6) declarator:
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
FunctionDef(FunctionDef {
|
FunctionDef(FunctionDef {
|
||||||
decl: Normal(NormalDecl {
|
decl: Normal(NormalDecl {
|
||||||
decl_spec: DeclSpec {
|
decl_spec: DeclSpec {
|
||||||
ty: Int,
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
attrs: "(empty)",
|
attrs: "(empty)",
|
||||||
},
|
},
|
||||||
init_declarators: [
|
init_declarators: [
|
||||||
|
|
@ -21,7 +21,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
FunctionParamDecl {
|
FunctionParamDecl {
|
||||||
decl_spec: (
|
decl_spec: (
|
||||||
DeclSpec {
|
DeclSpec {
|
||||||
ty: Long,
|
ty: Integer(IntTy { sign: Signed, kind: Long }),
|
||||||
attrs: "(empty)",
|
attrs: "(empty)",
|
||||||
},
|
},
|
||||||
9..13,
|
9..13,
|
||||||
|
|
@ -37,7 +37,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
FunctionParamDecl {
|
FunctionParamDecl {
|
||||||
decl_spec: (
|
decl_spec: (
|
||||||
DeclSpec {
|
DeclSpec {
|
||||||
ty: Int,
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
attrs: "(empty)",
|
attrs: "(empty)",
|
||||||
},
|
},
|
||||||
19..22,
|
19..22,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
FunctionDef(FunctionDef {
|
FunctionDef(FunctionDef {
|
||||||
decl: Normal(NormalDecl {
|
decl: Normal(NormalDecl {
|
||||||
decl_spec: DeclSpec {
|
decl_spec: DeclSpec {
|
||||||
ty: Int,
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
attrs: "EXTERN | THREAD_LOCAL",
|
attrs: "EXTERN | THREAD_LOCAL",
|
||||||
},
|
},
|
||||||
init_declarators: [
|
init_declarators: [
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
Decl(
|
Decl(
|
||||||
Normal(NormalDecl {
|
Normal(NormalDecl {
|
||||||
decl_spec: DeclSpec {
|
decl_spec: DeclSpec {
|
||||||
ty: Int,
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
attrs: "(empty)",
|
attrs: "(empty)",
|
||||||
},
|
},
|
||||||
init_declarators: [
|
init_declarators: [
|
||||||
|
|
@ -64,7 +64,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
Decl(
|
Decl(
|
||||||
Normal(NormalDecl {
|
Normal(NormalDecl {
|
||||||
decl_spec: DeclSpec {
|
decl_spec: DeclSpec {
|
||||||
ty: Int,
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
attrs: "(empty)",
|
attrs: "(empty)",
|
||||||
},
|
},
|
||||||
init_declarators: [
|
init_declarators: [
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,637 @@
|
||||||
|
---
|
||||||
|
source: parser/src/parser/tests.rs
|
||||||
|
expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
|
---
|
||||||
|
(
|
||||||
|
Ok([
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Char,
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("a", 24..25)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(1)), 28..29)),
|
||||||
|
},
|
||||||
|
24..25,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
10..25,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: SChar,
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("b", 54..55)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(2)), 58..59)),
|
||||||
|
},
|
||||||
|
54..55,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
31..55,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: UChar,
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("c", 84..85)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(3)), 88..89)),
|
||||||
|
},
|
||||||
|
84..85,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
61..85,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Short }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("d", 115..116)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(4)), 119..120)),
|
||||||
|
},
|
||||||
|
115..116,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
101..116,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Short }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("e", 145..146)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(6)), 149..150)),
|
||||||
|
},
|
||||||
|
145..146,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
122..146,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Short }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("f", 175..176)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(5)), 179..180)),
|
||||||
|
},
|
||||||
|
175..176,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
161..176,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Short }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("g", 205..206)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(7)), 209..210)),
|
||||||
|
},
|
||||||
|
205..206,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
182..206,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Unsigned,
|
||||||
|
kind: Short,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("h", 235..236)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(8)), 239..240)),
|
||||||
|
},
|
||||||
|
235..236,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
212..236,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Unsigned,
|
||||||
|
kind: Short,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("i", 265..266)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(9)), 269..270)),
|
||||||
|
},
|
||||||
|
265..266,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
242..266,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("j", 296..297)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(10)), 300..302)),
|
||||||
|
},
|
||||||
|
296..297,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
273..297,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("k", 327..328)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(11)), 331..333)),
|
||||||
|
},
|
||||||
|
327..328,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
323..328,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("l", 358..359)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(12)), 362..364)),
|
||||||
|
},
|
||||||
|
358..359,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
335..359,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Unsigned, kind: Int }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("m", 389..390)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(13)), 393..395)),
|
||||||
|
},
|
||||||
|
389..390,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
366..390,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Unsigned, kind: Int }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("n", 420..421)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(14)), 424..426)),
|
||||||
|
},
|
||||||
|
420..421,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
397..421,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Long }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("o", 452..453)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(15)), 456..458)),
|
||||||
|
},
|
||||||
|
452..453,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
438..453,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Long }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("p", 483..484)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(16)), 487..489)),
|
||||||
|
},
|
||||||
|
483..484,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
460..484,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Long }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("q", 514..515)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(17)), 518..520)),
|
||||||
|
},
|
||||||
|
514..515,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
500..515,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy { sign: Signed, kind: Long }),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("r", 545..546)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(18)), 549..551)),
|
||||||
|
},
|
||||||
|
545..546,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
522..546,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Unsigned,
|
||||||
|
kind: Long,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("s", 576..577)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(19)), 580..582)),
|
||||||
|
},
|
||||||
|
576..577,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
553..577,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Unsigned,
|
||||||
|
kind: Long,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("t", 607..608)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(20)), 611..613)),
|
||||||
|
},
|
||||||
|
607..608,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
584..608,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Signed,
|
||||||
|
kind: LongLong,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("u", 639..640)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(21)), 643..645)),
|
||||||
|
},
|
||||||
|
639..640,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
625..640,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Signed,
|
||||||
|
kind: LongLong,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("v", 670..671)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(22)), 674..676)),
|
||||||
|
},
|
||||||
|
670..671,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
647..671,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Signed,
|
||||||
|
kind: LongLong,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("w", 701..702)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(23)), 705..707)),
|
||||||
|
},
|
||||||
|
701..702,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
687..702,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Signed,
|
||||||
|
kind: LongLong,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("x", 732..733)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(24)), 736..738)),
|
||||||
|
},
|
||||||
|
732..733,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
709..733,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Unsigned,
|
||||||
|
kind: LongLong,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("y", 763..764)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(25)), 767..769)),
|
||||||
|
},
|
||||||
|
763..764,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
740..764,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Decl(
|
||||||
|
Normal(NormalDecl {
|
||||||
|
decl_spec: DeclSpec {
|
||||||
|
ty: Integer(IntTy {
|
||||||
|
sign: Unsigned,
|
||||||
|
kind: LongLong,
|
||||||
|
}),
|
||||||
|
attrs: "(empty)",
|
||||||
|
},
|
||||||
|
init_declarators: [
|
||||||
|
(
|
||||||
|
InitDecl {
|
||||||
|
declarator: Declarator {
|
||||||
|
decl: Ident(("z", 794..795)),
|
||||||
|
pointer: false,
|
||||||
|
},
|
||||||
|
init: Some((Atom(Int(26)), 798..800)),
|
||||||
|
},
|
||||||
|
794..795,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
771..795,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
"char a = 1;\nsigned char b = 2;\nunsigned char c = 3;\nshort d = 4;\nshort e = 6;\nshort f = 5;\nshort g = 7;\nunsigned short h = 8;\nunsigned short i = 9;\nint j = 10;\nint k = 11;\nint l = 12;\nunsigned int m = 13;\nunsigned int n = 14;\nlong o = 15;\nlong p = 16;\nlong q = 17;\nlong r = 18;\nunsigned long s = 19;\nunsigned long t = 20;\nlong long u = 21;\nlong long v = 22;\nlong long w = 23;\nlong long x = 24;\nunsigned long long y = 25;\nunsigned long long z = 26;\n",
|
||||||
|
)
|
||||||
|
|
@ -8,7 +8,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
Decl(
|
Decl(
|
||||||
Normal(NormalDecl {
|
Normal(NormalDecl {
|
||||||
decl_spec: DeclSpec {
|
decl_spec: DeclSpec {
|
||||||
ty: Int,
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
attrs: "(empty)",
|
attrs: "(empty)",
|
||||||
},
|
},
|
||||||
init_declarators: [
|
init_declarators: [
|
||||||
|
|
@ -38,7 +38,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
Decl(
|
Decl(
|
||||||
Normal(NormalDecl {
|
Normal(NormalDecl {
|
||||||
decl_spec: DeclSpec {
|
decl_spec: DeclSpec {
|
||||||
ty: Int,
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
attrs: "(empty)",
|
attrs: "(empty)",
|
||||||
},
|
},
|
||||||
init_declarators: [
|
init_declarators: [
|
||||||
|
|
@ -75,7 +75,7 @@ expression: "(parsed_pretty, pretty_printed_source)"
|
||||||
Decl(
|
Decl(
|
||||||
Normal(NormalDecl {
|
Normal(NormalDecl {
|
||||||
decl_spec: DeclSpec {
|
decl_spec: DeclSpec {
|
||||||
ty: Int,
|
ty: Integer(IntTy { sign: Signed, kind: Int }),
|
||||||
attrs: "(empty)",
|
attrs: "(empty)",
|
||||||
},
|
},
|
||||||
init_declarators: [
|
init_declarators: [
|
||||||
|
|
|
||||||
|
|
@ -83,3 +83,41 @@ int z = (array[9]);
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn integer_types() {
|
||||||
|
parse_test!(
|
||||||
|
r#"
|
||||||
|
char a = 1;
|
||||||
|
signed char b = 2;
|
||||||
|
unsigned char c = 3;
|
||||||
|
|
||||||
|
short d = 4;
|
||||||
|
signed short e = 6;
|
||||||
|
short int f = 5;
|
||||||
|
signed short int g = 7;
|
||||||
|
unsigned short h = 8;
|
||||||
|
unsigned short int i = 9;
|
||||||
|
|
||||||
|
signed j = 10;
|
||||||
|
int k = 11;
|
||||||
|
signed int l = 12;
|
||||||
|
unsigned m = 13;
|
||||||
|
unsigned int n = 14;
|
||||||
|
|
||||||
|
long o = 15;
|
||||||
|
signed long p = 16;
|
||||||
|
long int q = 17;
|
||||||
|
signed long int r = 18;
|
||||||
|
unsigned long s = 19;
|
||||||
|
unsigned long int t = 20;
|
||||||
|
|
||||||
|
long long u = 21;
|
||||||
|
signed long long v = 22;
|
||||||
|
long long int w = 23;
|
||||||
|
signed long long int x = 24;
|
||||||
|
unsigned long long y = 25;
|
||||||
|
unsigned long long int z = 26;
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,8 @@ use crate::{
|
||||||
ast::{
|
ast::{
|
||||||
ArithOpKind, Atom, BinaryOp, ComparisonKind, Decl, DeclAttr, DeclSpec, Declarator,
|
ArithOpKind, Atom, BinaryOp, ComparisonKind, Decl, DeclAttr, DeclSpec, Declarator,
|
||||||
DirectDeclarator, Expr, ExprBinary, ExprUnary, ExternalDecl, FunctionDef,
|
DirectDeclarator, Expr, ExprBinary, ExprUnary, ExternalDecl, FunctionDef,
|
||||||
FunctionParamDecl, InitDecl, NormalDecl, TypeSpecifier, UnaryOp,
|
FunctionParamDecl, InitDecl, IntTyKind, IntTySignedness, NormalDecl, TypeSpecifier,
|
||||||
|
UnaryOp,
|
||||||
},
|
},
|
||||||
Spanned,
|
Spanned,
|
||||||
};
|
};
|
||||||
|
|
@ -120,24 +121,29 @@ impl<W: Write> PrettyPrinter<W> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_specifier(&mut self, spec: &TypeSpecifier) -> Result {
|
fn type_specifier(&mut self, spec: &TypeSpecifier) -> Result {
|
||||||
self.string(match spec {
|
match spec {
|
||||||
TypeSpecifier::Void => "void",
|
TypeSpecifier::Void => self.string("void"),
|
||||||
TypeSpecifier::Char => "char",
|
TypeSpecifier::Char => self.string("char"),
|
||||||
TypeSpecifier::SChar => "signed char",
|
TypeSpecifier::SChar => self.string("signed char"),
|
||||||
TypeSpecifier::UChar => "unsigned char",
|
TypeSpecifier::UChar => self.string("unsigned char"),
|
||||||
TypeSpecifier::Short => "short",
|
TypeSpecifier::Integer(int) => {
|
||||||
TypeSpecifier::UShort => "usigned short",
|
// prefix the unsignedness if desired
|
||||||
TypeSpecifier::Int => "int",
|
if let IntTySignedness::Unsigned = int.sign {
|
||||||
TypeSpecifier::UInt => "unsugned int",
|
self.string("unsigned ")?;
|
||||||
TypeSpecifier::Long => "long",
|
}
|
||||||
TypeSpecifier::ULong => "unsigned long",
|
|
||||||
TypeSpecifier::LongLong => "long",
|
match int.kind {
|
||||||
TypeSpecifier::ULongLong => "unsigned long long",
|
IntTyKind::Short => self.string("short"),
|
||||||
TypeSpecifier::Float => "float",
|
IntTyKind::Int => self.string("int"),
|
||||||
TypeSpecifier::Double => "double",
|
IntTyKind::Long => self.string("long"),
|
||||||
TypeSpecifier::LongDouble => "long double",
|
IntTyKind::LongLong => self.string("long long"),
|
||||||
TypeSpecifier::Bool => "_Bool",
|
}
|
||||||
})
|
}
|
||||||
|
TypeSpecifier::Float => self.string("float"),
|
||||||
|
TypeSpecifier::Double => self.string("double"),
|
||||||
|
TypeSpecifier::LongDouble => self.string("long double"),
|
||||||
|
TypeSpecifier::Bool => self.string("_Bool"),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn decl_attr(&mut self, attr: &DeclAttr) -> Result {
|
fn decl_attr(&mut self, attr: &DeclAttr) -> Result {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue