Skip to content

Commit

Permalink
Implement a proc macro to derive AstNode
Browse files Browse the repository at this point in the history
  • Loading branch information
DCNick3 committed Jul 5, 2023
1 parent 76d4212 commit c255047
Show file tree
Hide file tree
Showing 21 changed files with 590 additions and 237 deletions.
11 changes: 11 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions shin-asm/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// macro hack
extern crate self as shin_asm;

pub mod ast;
pub mod parser;
pub mod syntax;
12 changes: 11 additions & 1 deletion shin-asm/src/parser/grammar/items.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ pub(super) fn item(p: &mut Parser<'_>) {
} else if p.at(T![subroutine]) {
todo!()
} else if p.at(IDENT) {
instruction_or_label(p);
instructions_block(p);
} else if p.at_ts(EOL_SET) {
p.bump_any();
// empty items are allowed
Expand All @@ -15,6 +15,16 @@ pub(super) fn item(p: &mut Parser<'_>) {
}
}

fn instructions_block(p: &mut Parser<'_>) {
let m = p.start();

while p.at(IDENT) {
instruction_or_label(p);
}

m.complete(p, INSTRUCTIONS_BLOCK);
}

fn instruction_or_label(p: &mut Parser<'_>) {
assert!(p.at(IDENT));

Expand Down
2 changes: 2 additions & 0 deletions shin-asm/src/parser/syntax_kind.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ syntax_kind! {
LABEL,
INSTRUCTION,

INSTRUCTIONS_BLOCK,

INSTR_ARG_LIST,
CALL_ARG_LIST,

Expand Down
39 changes: 17 additions & 22 deletions shin-asm/src/syntax/ast/nodes.rs
Original file line number Diff line number Diff line change
@@ -1,35 +1,30 @@
#![allow(non_snake_case)]

use crate::syntax::{
ast::{self, support, AstChildren, AstNode},

Check warning on line 4 in shin-asm/src/syntax/ast/nodes.rs

View workflow job for this annotation

GitHub Actions / build

unused imports: `AstChildren`, `SyntaxToken`, `T`, `self`, `support`

Check warning on line 4 in shin-asm/src/syntax/ast/nodes.rs

View workflow job for this annotation

GitHub Actions / build

unused import: `AstNode`
SyntaxKind::{self, *},
SyntaxNode, SyntaxToken, T,
};
use shin_derive::AstNode;

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[derive(Debug, Clone, PartialEq, Eq, Hash, AstNode)]
#[ast(kind = SOURCE_FILE)]
pub struct SourceFile {
pub(crate) syntax: SyntaxNode,
}

impl AstNode for SourceFile {
fn can_cast(kind: SyntaxKind) -> bool
where
Self: Sized,
{
kind == SOURCE_FILE
}

fn cast(syntax: SyntaxNode) -> Option<Self>
where
Self: Sized,
{
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
} else {
None
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, AstNode)]
pub enum Item {
// NOTE: this is not what we want to do with enums...
// we should support a enum of AstNodes, not of raw syntax nodes
#[ast(kind = INSTRUCTIONS_BLOCK)]
InstructionsBlock(SyntaxNode),
// FunctionDefinition(),
// SubroutineDefinition(),
}

fn syntax(&self) -> &SyntaxNode {
&self.syntax
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, AstNode)]
#[ast(kind = INSTRUCTIONS_BLOCK)]
pub struct InstructionsBlock {
pub(crate) syntax: SyntaxNode,
}
7 changes: 4 additions & 3 deletions shin-asm/test_data/parser/ok/0001_label.sast
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
SOURCE_FILE
LABEL
IDENT "LABEL"
COLON ":"
INSTRUCTIONS_BLOCK
LABEL
IDENT "LABEL"
COLON ":"
9 changes: 5 additions & 4 deletions shin-asm/test_data/parser/ok/0002_label_newline.sast
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
SOURCE_FILE
LABEL
IDENT "LABEL"
COLON ":"
NEWLINE "\n"
INSTRUCTIONS_BLOCK
LABEL
IDENT "LABEL"
COLON ":"
NEWLINE "\n"
43 changes: 23 additions & 20 deletions shin-asm/test_data/parser/ok/0003_many_labels.sast
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
SOURCE_FILE
LABEL
IDENT "LABEL1"
COLON ":"
WHITESPACE " "
LABEL
IDENT "LABEL2"
COLON ":"
NEWLINE "\n"
INSTRUCTIONS_BLOCK
LABEL
IDENT "LABEL1"
COLON ":"
WHITESPACE " "
LABEL
IDENT "LABEL2"
COLON ":"
NEWLINE "\n"
NEWLINE "\n"
LABEL
IDENT "LABEL3"
COLON ":"
NEWLINE "\n"
LABEL
IDENT "LABEL4"
COLON ":"
NEWLINE "\n"
INSTRUCTIONS_BLOCK
LABEL
IDENT "LABEL3"
COLON ":"
NEWLINE "\n"
LABEL
IDENT "LABEL4"
COLON ":"
NEWLINE "\n"
NEWLINE "\n"
LABEL
IDENT "LABEL5"
COLON ":"
NEWLINE "\n"
INSTRUCTIONS_BLOCK
LABEL
IDENT "LABEL5"
COLON ":"
NEWLINE "\n"
19 changes: 10 additions & 9 deletions shin-asm/test_data/parser/ok/0004_exit.sast
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
SOURCE_FILE
INSTRUCTION
IDENT "EXIT"
WHITESPACE " "
INSTR_ARG_LIST
LITERAL
INT_NUMBER "0"
COMMA ","
INSTRUCTIONS_BLOCK
INSTRUCTION
IDENT "EXIT"
WHITESPACE " "
LITERAL
INT_NUMBER "0"
INSTR_ARG_LIST
LITERAL
INT_NUMBER "0"
COMMA ","
WHITESPACE " "
LITERAL
INT_NUMBER "0"
29 changes: 15 additions & 14 deletions shin-asm/test_data/parser/ok/0004_labeled_exit.sast
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
SOURCE_FILE
LABEL
IDENT "LABEL"
COLON ":"
NEWLINE "\n"
WHITESPACE " "
INSTRUCTION
IDENT "EXIT"
WHITESPACE " "
INSTR_ARG_LIST
LITERAL
INT_NUMBER "0"
COMMA ","
INSTRUCTIONS_BLOCK
LABEL
IDENT "LABEL"
COLON ":"
NEWLINE "\n"
WHITESPACE " "
INSTRUCTION
IDENT "EXIT"
WHITESPACE " "
LITERAL
INT_NUMBER "0"
INSTR_ARG_LIST
LITERAL
INT_NUMBER "0"
COMMA ","
WHITESPACE " "
LITERAL
INT_NUMBER "0"
25 changes: 13 additions & 12 deletions shin-asm/test_data/parser/ok/0005_labeled_exit_one_line.sast
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
SOURCE_FILE
LABEL
IDENT "LABEL"
COLON ":"
INSTRUCTION
IDENT "EXIT"
WHITESPACE " "
INSTR_ARG_LIST
LITERAL
INT_NUMBER "0"
COMMA ","
INSTRUCTIONS_BLOCK
LABEL
IDENT "LABEL"
COLON ":"
INSTRUCTION
IDENT "EXIT"
WHITESPACE " "
LITERAL
INT_NUMBER "0"
INSTR_ARG_LIST
LITERAL
INT_NUMBER "0"
COMMA ","
WHITESPACE " "
LITERAL
INT_NUMBER "0"
53 changes: 27 additions & 26 deletions shin-asm/test_data/parser/ok/0006_expr.sast
Original file line number Diff line number Diff line change
@@ -1,29 +1,30 @@
SOURCE_FILE
INSTRUCTION
IDENT "exp"
WHITESPACE " "
INSTR_ARG_LIST
REGISTER_REF_EXPR
REGISTER_IDENT "$v1"
COMMA ","
WHITESPACE "\\\n "
BIN_EXPR
INSTRUCTIONS_BLOCK
INSTRUCTION
IDENT "exp"
WHITESPACE " "
INSTR_ARG_LIST
REGISTER_REF_EXPR
REGISTER_IDENT "$v1"
COMMA ","
WHITESPACE "\\\n "
BIN_EXPR
REGISTER_REF_EXPR
REGISTER_IDENT "$x"
BIN_EXPR
REGISTER_REF_EXPR
REGISTER_IDENT "$x"
WHITESPACE " "
DOT_STAR ".*"
WHITESPACE " "
REGISTER_REF_EXPR
REGISTER_IDENT "$x"
WHITESPACE " "
DOT_STAR ".*"
WHITESPACE " "
REGISTER_REF_EXPR
REGISTER_IDENT "$x"
WHITESPACE " "
PLUS "+"
WHITESPACE " \\\n "
BIN_EXPR
REGISTER_REF_EXPR
REGISTER_IDENT "$y"
WHITESPACE " "
DOT_STAR ".*"
WHITESPACE " "
REGISTER_REF_EXPR
REGISTER_IDENT "$y"
PLUS "+"
WHITESPACE " \\\n "
BIN_EXPR
REGISTER_REF_EXPR
REGISTER_IDENT "$y"
WHITESPACE " "
DOT_STAR ".*"
WHITESPACE " "
REGISTER_REF_EXPR
REGISTER_IDENT "$y"
Loading

0 comments on commit c255047

Please sign in to comment.