Initial Parser Implementation and Feature Completion #1

Merged
me merged 16 commits from parser-dev into main 2025-12-28 11:54:12 -06:00
5 changed files with 2653 additions and 96 deletions
Showing only changes of commit e2fa44738f - Show all commits

View File

@ -28,6 +28,7 @@ namespace arti::lang::ast {
return std::make_unique<typename Node::element_type>(); return std::make_unique<typename Node::element_type>();
} }
std::string toString(const AST &tree, std::size_t padding = 0); std::string toDot(const AST &tree);
std::string toString(const AST &tree, std::string prefix = "");
} // namespace arti::lang::ast } // namespace arti::lang::ast

View File

@ -111,6 +111,6 @@ namespace arti::lang {
}; };
std::string toString(const Token &value); std::string toString(const Token &value);
std::string toString(const TokenV &value); std::string_view toString(const TokenV &value);
} // namespace arti::lang } // namespace arti::lang

1048
lib/src/Parser/AST/toDot.cpp Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,109 +7,109 @@ namespace arti::lang {
std::string toString(const Token &value) { std::string toString(const Token &value) {
using enum TokenV; using enum TokenV;
std::string tokenStr = toString(value.value); std::string tokenStr{ toString(value.value) };
if (value.value == tkEOF) { if (value.value == tkEOF) {
return std::format("Token{{ {} }}", tokenStr); return "EOF";
} }
return std::format("Token{{ {}, {} }}", tokenStr, value.strValue); return std::format("{}", value.strValue);
} }
std::string toString(const TokenV &value) { std::string_view toString(const TokenV &value) {
using enum TokenV; using enum TokenV;
switch (value) { switch (value) {
case tkEOF: return "tkEOF"; case tkEOF: return "EOF";
case tkString: return "tkString"; case tkString: return "string";
case tkDecimal: return "tkDecimal"; case tkDecimal: return "number";
case tkInteger: return "tkInteger"; case tkInteger: return "integer";
case tkCharacter: return "tkCharacter"; case tkCharacter: return "character";
case tkIdentifier: return "tkIdentifier"; case tkIdentifier: return "identifier";
case opDot: return "opDot"; case opDot: return "'.'";
case opMod: return "opMod"; case opMod: return "'%'";
case opPlus: return "opPlus"; case opPlus: return "'+'";
case opHyphen: return "opHyphen"; case opHyphen: return "'-'";
case opSlash: return "opSlash"; case opSlash: return "'/'";
case opBang: return "opBang"; case opBang: return "'!'";
case opStar: return "opStar"; case opStar: return "'*'";
case opColon: return "opColon"; case opColon: return "':'";
case opComma: return "opComma"; case opComma: return "','";
case opAssign: return "opAssign"; case opAssign: return "'='";
case opAccess: return "opAccess"; case opAccess: return "'::'";
case opSemicolon: return "opSemicolon"; case opSemicolon: return "';'";
case opCaret: return "opCaret"; case opCaret: return "'^'";
case opTilde: return "opTilde"; case opTilde: return "'~'";
case opEq: return "opEq"; case opEq: return "'=='";
case opNeq: return "opNeq"; case opNeq: return "'!='";
case opLt: return "opLt"; case opLt: return "'<'";
case opGt: return "opGt"; case opGt: return "'>'";
case opLtEq: return "opLtEq"; case opLtEq: return "'<='";
case opGtEq: return "opGtEq"; case opGtEq: return "'>='";
case opLShift: return "opLShift"; case opLShift: return "'<<'";
case opRShift: return "opRShift"; case opRShift: return "'>>'";
case opBoolAnd: return "opBoolAnd"; case opBoolAnd: return "'&&'";
case opBoolOr: return "opBoolOr"; case opBoolOr: return "'||'";
case opAnd: return "opAnd"; case opAnd: return "'&'";
case opOr: return "opOr"; case opOr: return "'|'";
case opLParen: return "opLParen"; case opLParen: return "'('";
case opRParen: return "opRParen"; case opRParen: return "')'";
case opLBracket: return "opLBracket"; case opLBracket: return "'['";
case opRBracket: return "opRBracket"; case opRBracket: return "']'";
case opLSquirly: return "opLSquirly"; case opLSquirly: return "'{'";
case opRSquirly: return "opRSquirly"; case opRSquirly: return "'}'";
case opArrow: return "opArrow"; case opArrow: return "'->'";
case opPlusAssign: return "opPlusAssign"; case opPlusAssign: return "'+='";
case opHyphenAssign: return "opHyphenAssign"; case opHyphenAssign: return "'-='";
case opStarAssign: return "opStarAssign"; case opStarAssign: return "'*='";
case opSlashAssign: return "opSlashAssign"; case opSlashAssign: return "'/='";
case opModAssign: return "opModAssign"; case opModAssign: return "'%='";
case opAndAssign: return "opAndAssign"; case opAndAssign: return "'&='";
case opOrAssign: return "opOrAssign"; case opOrAssign: return "'|='";
case opLShiftAssign: return "opLShiftAssign"; case opLShiftAssign: return "'<<='";
case opRShiftAssign: return "opRShiftAssign"; case opRShiftAssign: return "'>>='";
case opBoolAndAssign: return "opBoolAndAssign"; case opBoolAndAssign: return "'&&='";
case opBoolOrAssign: return "opBoolORAssign"; case opBoolOrAssign: return "'||='";
case opMut: return "opMut"; case opMut: return "'$'";
case opOpt: return "opOpt"; case opOpt: return "'?'";
case opSliceSize: return "opSliceSize"; case opSliceSize: return "'.#'";
case opPtrSlice: return "opPtrSlice"; case opPtrSlice: return "'.['";
case opSlicePtr: return "opSlicePtr"; case opSlicePtr: return "'.*'";
case opReflect: return "opReflect"; case opReflect: return "'.@'";
case opLabel: return "opLabel"; case opLabel: return "':='";
case kwUnderscore: return "kwUnderscore"; case kwUnderscore: return "'underscore'";
case kwOr: return "kwOr"; case kwOr: return "'or'";
case kwNot: return "kwNot"; case kwNot: return "'not'";
case kwAnd: return "kwAnd"; case kwAnd: return "'and'";
case kwIf: return "kwIf"; case kwIf: return "'if'";
case kwElse: return "kwElse"; case kwElse: return "'else'";
case kwFn: return "kwFn"; case kwFn: return "'fn'";
case kwEnum: return "kwEnum"; case kwEnum: return "'enum'";
case kwStruct: return "kwStruct"; case kwStruct: return "'struct'";
case kwDef: return "kwDef"; case kwDef: return "'def'";
case kwLet: return "kwLet"; case kwLet: return "'let'";
case kwFor: return "kwFor"; case kwFor: return "'for'";
case kwLoop: return "kwLoop"; case kwLoop: return "'loop'";
case kwBreak: return "kwBreak"; case kwBreak: return "'break'";
case kwContinue: return "kwContinue"; case kwContinue: return "'continue'";
case kwDo: return "kwDo"; case kwDo: return "'do'";
case kwWhile: return "kwWhile"; case kwWhile: return "'while'";
case kwMatch: return "kwMatch"; case kwMatch: return "'match'";
case kwSwitch: return "kwSwitch"; case kwSwitch: return "'switch'";
case kwReturn: return "kwReturn"; case kwReturn: return "'return'";
case kwUnreachable: return "kwUnreachable"; case kwUnreachable: return "'unreachable'";
case kwTypename: return "kwTypename"; case kwTypename: return "'typename'";
case kwDefer: return "kwDefer"; case kwDefer: return "'defer'";
case kwErrDefer: return "kwErrDefer"; case kwErrDefer: return "'errdefer'";
case kwTrue: return "kwTrue"; case kwTrue: return "'true'";
case kwFalse: return "kwFalse"; case kwFalse: return "'false'";
case kwNull: return "kwNull"; case kwNull: return "'null'";
case kwThis: return "kwThis"; case kwThis: return "'this'";
case kwImport: return "kwImport"; case kwImport: return "'import'";
case kwExport: return "kwExport"; case kwExport: return "'export'";
case kwModule: return "kwModule"; case kwModule: return "'module'";
case kwUsing: return "kwUsing"; case kwUsing: return "'using'";
default: return "<Undefined>"; default: return "<undefined>";
} }
} }