NAC_Blockchain/charter-compiler/src/parser/mod.rs

944 lines
32 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Charter Parser - 语法分析器模块
// 将Token流转换为AST
pub mod ast;
use crate::lexer::Token;
use ast::*;
use nac_udm::prelude::*;
use nac_udm::primitives::SovereigntyType;
use thiserror::Error;
#[derive(Error, Debug)]
#[allow(dead_code)]
pub enum ParseError {
#[error("意外的Token: 期望 {expected}, 实际 {actual:?}")]
UnexpectedToken { expected: String, actual: String },
#[error("意外的文件结束")]
UnexpectedEOF,
#[error("无效的类型注解")]
InvalidTypeAnnotation,
#[error("无效的表达式")]
InvalidExpression,
#[error("缺少GNACS声明")]
MissingGNACSDeclaration,
#[error("无效的GNACS编码: {0}")]
InvalidGNACSCode(String),
}
pub struct Parser {
tokens: Vec<Token>,
current: usize,
}
impl Parser {
pub fn new(tokens: Vec<Token>) -> Self {
Self { tokens, current: 0 }
}
fn is_at_end(&self) -> bool {
self.current >= self.tokens.len()
}
fn peek(&self) -> Option<&Token> {
self.tokens.get(self.current)
}
fn advance(&mut self) -> Option<&Token> {
if !self.is_at_end() {
self.current += 1;
self.tokens.get(self.current - 1)
} else {
None
}
}
fn expect(&mut self, expected: Token) -> Result<(), ParseError> {
if let Some(token) = self.peek() {
if std::mem::discriminant(token) == std::mem::discriminant(&expected) {
self.advance();
Ok(())
} else {
Err(ParseError::UnexpectedToken {
expected: format!("{:?}", expected),
actual: format!("{:?}", token),
})
}
} else {
Err(ParseError::UnexpectedEOF)
}
}
pub fn parse_program(&mut self) -> Result<Program, ParseError> {
let mut items = Vec::new();
while !self.is_at_end() {
items.push(self.parse_top_level_item()?);
}
Ok(Program { items })
}
fn parse_top_level_item(&mut self) -> Result<TopLevelItem, ParseError> {
match self.peek() {
Some(Token::Module) => {
self.advance();
let name = self.parse_identifier()?;
self.expect(Token::Semicolon)?;
Ok(TopLevelItem::Module(ModuleDeclaration { name }))
}
Some(Token::Import) => {
self.advance();
let path = self.parse_string_literal()?;
self.expect(Token::Semicolon)?;
Ok(TopLevelItem::Import(ImportStatement { path }))
}
Some(Token::Asset) => {
Ok(TopLevelItem::Asset(self.parse_asset_definition()?))
}
Some(Token::Contract) => {
Ok(TopLevelItem::Contract(self.parse_contract_definition()?))
}
Some(Token::Pub) | Some(Token::Public) | Some(Token::Fn) => {
Ok(TopLevelItem::Function(self.parse_function_declaration()?))
}
_ => Err(ParseError::UnexpectedToken {
expected: "module, import, asset, contract, or function".to_string(),
actual: format!("{:?}", self.peek()),
}),
}
}
fn parse_asset_definition(&mut self) -> Result<AssetDefinition, ParseError> {
self.expect(Token::Asset)?;
let name = self.parse_identifier()?;
self.expect(Token::LeftBrace)?;
// 解析GNACS声明必须
self.expect(Token::Gnacs)?;
self.expect(Token::Colon)?;
let gnacs_hex = self.parse_hex_number()?;
// 使用NAC UDM的GNACSCode::from_hex创建
let gnacs_code = GNACSCode::from_hex(&gnacs_hex)
.map_err(|e| ParseError::InvalidGNACSCode(e))?;
self.expect(Token::Semicolon)?;
// 解析主权声明(可选)
let sovereignty = if matches!(self.peek(), Some(Token::Sovereignty)) {
self.advance();
self.expect(Token::Colon)?;
let sov = self.parse_sovereignty_type()?;
self.expect(Token::Semicolon)?;
Some(sov)
} else {
None
};
// 解析字段
let mut fields = Vec::new();
while !matches!(self.peek(), Some(Token::RightBrace) | Some(Token::Public) | Some(Token::Private) | Some(Token::Fn)) {
fields.push(self.parse_field_declaration()?);
self.expect(Token::Semicolon)?;
}
// 解析方法
let mut methods = Vec::new();
while matches!(self.peek(), Some(Token::Public) | Some(Token::Private) | Some(Token::Fn)) {
methods.push(self.parse_method_declaration()?);
}
self.expect(Token::RightBrace)?;
Ok(AssetDefinition {
name,
gnacs_code,
sovereignty,
fields,
methods,
})
}
fn parse_contract_definition(&mut self) -> Result<ContractDefinition, ParseError> {
self.expect(Token::Contract)?;
let name = self.parse_identifier()?;
self.expect(Token::LeftBrace)?;
// 解析字段
let mut fields = Vec::new();
while !matches!(self.peek(), Some(Token::RightBrace) | Some(Token::Public) | Some(Token::Private) | Some(Token::Fn)) {
fields.push(self.parse_field_declaration()?);
self.expect(Token::Semicolon)?;
}
// 解析方法
let mut methods = Vec::new();
while matches!(self.peek(), Some(Token::Public) | Some(Token::Private) | Some(Token::Fn)) {
methods.push(self.parse_method_declaration()?);
}
self.expect(Token::RightBrace)?;
Ok(ContractDefinition {
name,
fields,
methods,
})
}
fn parse_field_declaration(&mut self) -> Result<FieldDeclaration, ParseError> {
let name = self.parse_identifier()?;
self.expect(Token::Colon)?;
let type_annotation = self.parse_type_annotation()?;
Ok(FieldDeclaration {
name,
type_annotation,
})
}
fn parse_function_declaration(&mut self) -> Result<FunctionDeclaration, ParseError> {
// 解析修饰符
let mut modifiers = Vec::new();
while let Some(modifier) = self.parse_method_modifier() {
modifiers.push(modifier);
}
self.expect(Token::Fn)?;
let name = self.parse_identifier()?;
self.expect(Token::LeftParen)?;
// 解析参数
let mut parameters = Vec::new();
if !matches!(self.peek(), Some(Token::RightParen)) {
loop {
parameters.push(self.parse_parameter()?);
if matches!(self.peek(), Some(Token::Comma)) {
self.advance();
} else {
break;
}
}
}
self.expect(Token::RightParen)?;
// 解析返回类型
let return_type = if matches!(self.peek(), Some(Token::Arrow)) {
self.advance();
Some(self.parse_type_annotation()?)
} else {
None
};
// 解析函数体
let body = self.parse_block()?;
Ok(FunctionDeclaration {
modifiers,
name,
parameters,
return_type,
body,
})
}
fn parse_method_declaration(&mut self) -> Result<MethodDeclaration, ParseError> {
// 解析修饰符
let mut modifiers = Vec::new();
while let Some(modifier) = self.parse_method_modifier() {
modifiers.push(modifier);
}
self.expect(Token::Fn)?;
let name = self.parse_identifier()?;
self.expect(Token::LeftParen)?;
// 解析参数
let mut parameters = Vec::new();
if !matches!(self.peek(), Some(Token::RightParen)) {
loop {
parameters.push(self.parse_parameter()?);
if matches!(self.peek(), Some(Token::Comma)) {
self.advance();
} else {
break;
}
}
}
self.expect(Token::RightParen)?;
// 解析返回类型
let return_type = if matches!(self.peek(), Some(Token::Arrow)) {
self.advance();
Some(self.parse_type_annotation()?)
} else {
None
};
// 解析requires子句
let requires = if matches!(self.peek(), Some(Token::Requires)) {
self.advance();
self.expect(Token::LeftBrace)?;
let mut exprs = Vec::new();
while !matches!(self.peek(), Some(Token::RightBrace)) {
exprs.push(self.parse_expression()?);
self.expect(Token::Semicolon)?;
}
self.expect(Token::RightBrace)?;
exprs
} else {
Vec::new()
};
// 解析ensures子句
let ensures = if matches!(self.peek(), Some(Token::Ensures)) {
self.advance();
self.expect(Token::LeftBrace)?;
let mut exprs = Vec::new();
while !matches!(self.peek(), Some(Token::RightBrace)) {
exprs.push(self.parse_expression()?);
self.expect(Token::Semicolon)?;
}
self.expect(Token::RightBrace)?;
exprs
} else {
Vec::new()
};
// 解析方法体
let body = self.parse_block()?;
Ok(MethodDeclaration {
modifiers,
name,
parameters,
return_type,
requires,
ensures,
body,
})
}
fn parse_method_modifier(&mut self) -> Option<MethodModifier> {
match self.peek() {
Some(Token::Pub) | Some(Token::Public) => {
self.advance();
Some(MethodModifier::Public)
}
Some(Token::Private) => {
self.advance();
Some(MethodModifier::Private)
}
Some(Token::Internal) => {
self.advance();
Some(MethodModifier::Internal)
}
Some(Token::Payable) => {
self.advance();
Some(MethodModifier::Payable)
}
Some(Token::View) => {
self.advance();
Some(MethodModifier::View)
}
Some(Token::Pure) => {
self.advance();
Some(MethodModifier::Pure)
}
_ => None,
}
}
fn parse_parameter(&mut self) -> Result<Parameter, ParseError> {
let name = self.parse_identifier()?;
self.expect(Token::Colon)?;
let type_annotation = self.parse_type_annotation()?;
Ok(Parameter {
name,
type_annotation,
})
}
fn parse_type_annotation(&mut self) -> Result<TypeAnnotation, ParseError> {
// 检查是否是引用类型
if matches!(self.peek(), Some(Token::Ampersand)) {
self.advance();
let inner_type = self.parse_type_annotation()?;
return Ok(TypeAnnotation::Reference(Box::new(inner_type)));
}
let base_type = match self.peek() {
Some(Token::Uint8) => { self.advance(); TypeAnnotation::Uint8 }
Some(Token::Uint16) => { self.advance(); TypeAnnotation::Uint16 }
Some(Token::Uint32) => { self.advance(); TypeAnnotation::Uint32 }
Some(Token::Uint64) => { self.advance(); TypeAnnotation::Uint64 }
Some(Token::Uint128) => { self.advance(); TypeAnnotation::Uint128 }
Some(Token::Uint256) => { self.advance(); TypeAnnotation::Uint256 }
Some(Token::Int8) => { self.advance(); TypeAnnotation::Int8 }
Some(Token::Int16) => { self.advance(); TypeAnnotation::Int16 }
Some(Token::Int32) => { self.advance(); TypeAnnotation::Int32 }
Some(Token::Int64) => { self.advance(); TypeAnnotation::Int64 }
Some(Token::Int128) => { self.advance(); TypeAnnotation::Int128 }
Some(Token::Int256) => { self.advance(); TypeAnnotation::Int256 }
Some(Token::Bool) => { self.advance(); TypeAnnotation::Bool }
Some(Token::String) => { self.advance(); TypeAnnotation::String }
Some(Token::Bytes) => { self.advance(); TypeAnnotation::Bytes }
Some(Token::Address) => { self.advance(); TypeAnnotation::Address }
Some(Token::Hash) => { self.advance(); TypeAnnotation::Hash }
Some(Token::Timestamp) => { self.advance(); TypeAnnotation::Timestamp }
Some(Token::DID) => { self.advance(); TypeAnnotation::DID }
Some(Token::GNACSCode) => { self.advance(); TypeAnnotation::GNACSCode }
Some(Token::ConstitutionalReceipt) => { self.advance(); TypeAnnotation::ConstitutionalReceipt }
Some(Token::AssetInstance) => { self.advance(); TypeAnnotation::AssetInstance }
Some(Token::ACC20) => { self.advance(); TypeAnnotation::ACC20 }
Some(Token::ACC721) => { self.advance(); TypeAnnotation::ACC721 }
Some(Token::ACC1155) => { self.advance(); TypeAnnotation::ACC1155 }
Some(Token::ACCRWA) => { self.advance(); TypeAnnotation::ACCRWA }
Some(Token::Identifier(name)) if name == "Vec" => {
self.advance();
self.expect(Token::Less)?;
let inner_type = self.parse_type_annotation()?;
self.expect(Token::Greater)?;
TypeAnnotation::Vec(Box::new(inner_type))
}
_ => return Err(ParseError::InvalidTypeAnnotation),
};
// 检查是否是数组类型
if matches!(self.peek(), Some(Token::LeftBracket)) {
self.advance();
let size = if let Some(Token::Integer(n)) = self.peek() {
let size = *n as usize;
self.advance();
Some(size)
} else {
None
};
self.expect(Token::RightBracket)?;
Ok(TypeAnnotation::Array(Box::new(base_type), size))
} else {
Ok(base_type)
}
}
fn parse_sovereignty_type(&mut self) -> Result<SovereigntyType, ParseError> {
match self.peek() {
Some(Token::A0) => { self.advance(); Ok(SovereigntyType::A0) }
Some(Token::C0) => { self.advance(); Ok(SovereigntyType::C0) }
Some(Token::C1) => { self.advance(); Ok(SovereigntyType::C1) }
Some(Token::C2) => { self.advance(); Ok(SovereigntyType::C2) }
Some(Token::D0) => { self.advance(); Ok(SovereigntyType::D0) }
Some(Token::D1) => { self.advance(); Ok(SovereigntyType::D1) }
Some(Token::D2) => { self.advance(); Ok(SovereigntyType::D2) }
_ => Err(ParseError::UnexpectedToken {
expected: "sovereignty type (A0, C0, C1, C2, D0, D1, D2)".to_string(),
actual: format!("{:?}", self.peek()),
}),
}
}
fn parse_block(&mut self) -> Result<Block, ParseError> {
self.expect(Token::LeftBrace)?;
let mut statements = Vec::new();
while !matches!(self.peek(), Some(Token::RightBrace)) {
statements.push(self.parse_statement()?);
}
self.expect(Token::RightBrace)?;
Ok(Block { statements })
}
fn parse_statement(&mut self) -> Result<Statement, ParseError> {
match self.peek() {
Some(Token::Let) => {
self.advance();
// 检查是否有mut关键字
let mutable = if matches!(self.peek(), Some(Token::Mut)) {
self.advance();
true
} else {
false
};
let name = self.parse_identifier()?;
let type_annotation = if matches!(self.peek(), Some(Token::Colon)) {
self.advance();
Some(self.parse_type_annotation()?)
} else {
None
};
self.expect(Token::Assign)?;
let value = self.parse_expression()?;
self.expect(Token::Semicolon)?;
Ok(Statement::Let(LetStatement {
mutable,
name,
type_annotation,
value,
}))
}
Some(Token::If) => {
self.advance();
let condition = self.parse_expression()?;
let then_block = self.parse_block()?;
let else_block = if matches!(self.peek(), Some(Token::Else)) {
self.advance();
Some(self.parse_block()?)
} else {
None
};
Ok(Statement::If(IfStatement {
condition,
then_block,
else_block,
}))
}
Some(Token::For) => {
self.advance();
let variable = self.parse_identifier()?;
self.expect(Token::In)?;
let iterable = self.parse_expression()?;
let body = self.parse_block()?;
Ok(Statement::For(ForStatement {
variable,
iterable,
body,
}))
}
Some(Token::While) => {
self.advance();
let condition = self.parse_expression()?;
let body = self.parse_block()?;
Ok(Statement::While(WhileStatement {
condition,
body,
}))
}
Some(Token::Return) => {
self.advance();
let value = if matches!(self.peek(), Some(Token::Semicolon)) {
None
} else {
Some(self.parse_expression()?)
};
self.expect(Token::Semicolon)?;
Ok(Statement::Return(ReturnStatement { value }))
}
Some(Token::Emit) => {
self.advance();
let event_name = self.parse_identifier()?;
self.expect(Token::LeftParen)?;
let mut arguments = Vec::new();
if !matches!(self.peek(), Some(Token::RightParen)) {
loop {
arguments.push(self.parse_expression()?);
if matches!(self.peek(), Some(Token::Comma)) {
self.advance();
} else {
break;
}
}
}
self.expect(Token::RightParen)?;
self.expect(Token::Semicolon)?;
Ok(Statement::Emit(EmitStatement {
event_name,
arguments,
}))
}
Some(Token::RequireCR) => {
self.advance();
self.expect(Token::LeftParen)?;
let expr = self.parse_expression()?;
self.expect(Token::RightParen)?;
self.expect(Token::Semicolon)?;
Ok(Statement::RequireCR(expr))
}
Some(Token::VerifyCR) => {
self.advance();
self.expect(Token::LeftParen)?;
let expr = self.parse_expression()?;
self.expect(Token::RightParen)?;
self.expect(Token::Semicolon)?;
Ok(Statement::VerifyCR(expr))
}
Some(Token::Identifier(_)) => {
// 可能是赋值或表达式语句
let start_pos = self.current;
let name = self.parse_identifier()?;
if matches!(self.peek(), Some(Token::Assign)) {
self.advance();
let value = self.parse_expression()?;
self.expect(Token::Semicolon)?;
Ok(Statement::Assign(AssignStatement {
target: name,
value,
}))
} else {
// 回退并解析为表达式语句
self.current = start_pos;
let expr = self.parse_expression()?;
self.expect(Token::Semicolon)?;
Ok(Statement::Expression(expr))
}
}
_ => {
let expr = self.parse_expression()?;
self.expect(Token::Semicolon)?;
Ok(Statement::Expression(expr))
}
}
}
fn parse_expression(&mut self) -> Result<Expression, ParseError> {
self.parse_logical_or()
}
fn parse_logical_or(&mut self) -> Result<Expression, ParseError> {
let mut left = self.parse_logical_and()?;
while matches!(self.peek(), Some(Token::Or)) {
self.advance();
let right = self.parse_logical_and()?;
left = Expression::Binary(BinaryOp::Or, Box::new(left), Box::new(right));
}
Ok(left)
}
fn parse_logical_and(&mut self) -> Result<Expression, ParseError> {
let mut left = self.parse_equality()?;
while matches!(self.peek(), Some(Token::And)) {
self.advance();
let right = self.parse_equality()?;
left = Expression::Binary(BinaryOp::And, Box::new(left), Box::new(right));
}
Ok(left)
}
fn parse_equality(&mut self) -> Result<Expression, ParseError> {
let mut left = self.parse_relational()?;
while let Some(token) = self.peek() {
let op = match token {
Token::Equal => BinaryOp::Equal,
Token::NotEqual => BinaryOp::NotEqual,
_ => break,
};
self.advance();
let right = self.parse_relational()?;
left = Expression::Binary(op, Box::new(left), Box::new(right));
}
Ok(left)
}
fn parse_relational(&mut self) -> Result<Expression, ParseError> {
let mut left = self.parse_additive()?;
while let Some(token) = self.peek() {
let op = match token {
Token::Less => BinaryOp::Less,
Token::Greater => BinaryOp::Greater,
Token::LessEqual => BinaryOp::LessEqual,
Token::GreaterEqual => BinaryOp::GreaterEqual,
_ => break,
};
self.advance();
let right = self.parse_additive()?;
left = Expression::Binary(op, Box::new(left), Box::new(right));
}
Ok(left)
}
fn parse_additive(&mut self) -> Result<Expression, ParseError> {
let mut left = self.parse_multiplicative()?;
while let Some(token) = self.peek() {
let op = match token {
Token::Plus => BinaryOp::Add,
Token::Minus => BinaryOp::Sub,
_ => break,
};
self.advance();
let right = self.parse_multiplicative()?;
left = Expression::Binary(op, Box::new(left), Box::new(right));
}
Ok(left)
}
fn parse_multiplicative(&mut self) -> Result<Expression, ParseError> {
let mut left = self.parse_unary()?;
while let Some(token) = self.peek() {
let op = match token {
Token::Star => BinaryOp::Mul,
Token::Slash => BinaryOp::Div,
Token::Percent => BinaryOp::Mod,
_ => break,
};
self.advance();
let right = self.parse_unary()?;
left = Expression::Binary(op, Box::new(left), Box::new(right));
}
Ok(left)
}
fn parse_unary(&mut self) -> Result<Expression, ParseError> {
match self.peek() {
Some(Token::Not) => {
self.advance();
let expr = self.parse_unary()?;
Ok(Expression::Unary(UnaryOp::Not, Box::new(expr)))
}
Some(Token::Minus) => {
self.advance();
let expr = self.parse_unary()?;
Ok(Expression::Unary(UnaryOp::Neg, Box::new(expr)))
}
_ => self.parse_postfix(),
}
}
fn parse_postfix(&mut self) -> Result<Expression, ParseError> {
let mut expr = self.parse_primary()?;
loop {
match self.peek() {
Some(Token::Dot) => {
self.advance();
let member = self.parse_identifier()?;
expr = Expression::MemberAccess(Box::new(expr), member);
}
Some(Token::LeftBracket) => {
self.advance();
let index = self.parse_expression()?;
self.expect(Token::RightBracket)?;
expr = Expression::ArrayAccess(Box::new(expr), Box::new(index));
}
Some(Token::LeftParen) => {
// 函数调用
if let Expression::Identifier(name) = expr {
self.advance();
let mut arguments = Vec::new();
if !matches!(self.peek(), Some(Token::RightParen)) {
loop {
arguments.push(self.parse_expression()?);
if matches!(self.peek(), Some(Token::Comma)) {
self.advance();
} else {
break;
}
}
}
self.expect(Token::RightParen)?;
expr = Expression::FunctionCall(name, arguments);
} else {
break;
}
}
Some(Token::As) => {
self.advance();
let target_type = self.parse_type_annotation()?;
expr = Expression::Cast(Box::new(expr), target_type);
}
_ => break,
}
}
Ok(expr)
}
fn parse_primary(&mut self) -> Result<Expression, ParseError> {
match self.peek() {
Some(Token::Integer(n)) => {
let value = *n;
self.advance();
Ok(Expression::Integer(value))
}
Some(Token::HexNumber(s)) => {
// 检查是否是GNACS编码48位十六进制
let value = s.clone();
self.advance();
if value.len() == 26 { // 0x + 24位十六进制 = 48位bit
Ok(Expression::GNACSCode(value))
} else {
Ok(Expression::HexNumber(value))
}
}
Some(Token::StringLiteral(s)) => {
let value = s.clone();
self.advance();
Ok(Expression::String(value))
}
Some(Token::True) => {
self.advance();
Ok(Expression::Boolean(true))
}
Some(Token::False) => {
self.advance();
Ok(Expression::Boolean(false))
}
Some(Token::DIDLiteral(s)) => {
let value = s.clone();
self.advance();
Ok(Expression::DID(value))
}
Some(Token::If) => {
self.advance();
let condition = self.parse_expression()?;
self.expect(Token::LeftBrace)?;
let then_expr = self.parse_expression()?;
self.expect(Token::RightBrace)?;
self.expect(Token::Else)?;
self.expect(Token::LeftBrace)?;
let else_expr = self.parse_expression()?;
self.expect(Token::RightBrace)?;
Ok(Expression::If(Box::new(condition), Box::new(then_expr), Box::new(else_expr)))
}
Some(Token::Require) => {
self.advance();
Ok(Expression::Identifier("require".to_string()))
}
Some(Token::Identifier(s)) => {
let name = s.clone();
self.advance();
Ok(Expression::Identifier(name))
}
Some(Token::LeftParen) => {
self.advance();
let expr = self.parse_expression()?;
self.expect(Token::RightParen)?;
Ok(expr)
}
_ => {
// 提供更详细的错误信息
Err(ParseError::InvalidExpression)
}
}
}
fn parse_identifier(&mut self) -> Result<String, ParseError> {
if let Some(Token::Identifier(s)) = self.peek() {
let name = s.clone();
self.advance();
Ok(name)
} else {
Err(ParseError::UnexpectedToken {
expected: "identifier".to_string(),
actual: format!("{:?}", self.peek()),
})
}
}
fn parse_string_literal(&mut self) -> Result<String, ParseError> {
if let Some(Token::StringLiteral(s)) = self.peek() {
let value = s.clone();
self.advance();
Ok(value)
} else {
Err(ParseError::UnexpectedToken {
expected: "string literal".to_string(),
actual: format!("{:?}", self.peek()),
})
}
}
fn parse_hex_number(&mut self) -> Result<String, ParseError> {
if let Some(Token::HexNumber(s)) = self.peek() {
let value = s.clone();
self.advance();
Ok(value)
} else {
Err(ParseError::UnexpectedToken {
expected: "hex number".to_string(),
actual: format!("{:?}", self.peek()),
})
}
}
}
/// 解析Token流为AST
pub fn parse(tokens: &[Token]) -> anyhow::Result<Program> {
let mut parser = Parser::new(tokens.to_vec());
Ok(parser.parse_program()?)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::lexer::tokenize;
#[test]
fn test_parse_empty() {
let tokens = vec![];
let program = parse(&tokens).unwrap();
assert_eq!(program.items.len(), 0);
}
#[test]
fn test_parse_module() {
let source = "module test;";
let tokens = tokenize(source).unwrap();
let program = parse(&tokens).unwrap();
assert_eq!(program.items.len(), 1);
assert!(matches!(program.items[0], TopLevelItem::Module(_)));
}
#[test]
fn test_parse_asset() {
let source = r#"
asset TestAsset {
gnacs: 0x940101120187;
sovereignty: C2;
owner: DID;
amount: uint256;
}
"#;
let tokens = tokenize(source).unwrap();
let program = parse(&tokens).unwrap();
assert_eq!(program.items.len(), 1);
if let TopLevelItem::Asset(asset) = &program.items[0] {
assert_eq!(asset.name, "TestAsset");
// 验证GNACS编码使用to_hex方法
assert_eq!(asset.gnacs_code.to_hex(), "940101120187");
assert!(matches!(asset.sovereignty, Some(SovereigntyType::C2)));
assert_eq!(asset.fields.len(), 2);
} else {
panic!("Expected asset definition");
}
}
}