/** * This is where the bodies (of ugly non-type-safe code) are buried. * * Consumes (and sort-of documents) the messy output produced by the parser, and turns it into parsedsyntax.ts * types. This file will produce garbage output if there's a mismatch between the documented types and the * types that the parser produces, since Typescript refuses to document that. * * Convention: as much as possible, this file should ***only throw errors to document invariants of the parser*** * Non-implementation (user-facing) errors should be thrown in restrictsyntax.ts. * * The structure of this file should match ast.ts as much as practical. */ import { Token } from "moo"; import * as syn from "./parsedsyntax"; import { Position } from "../ast"; export declare type WS = { contents: (Token | WS)[]; }; export declare function Identifier([tok]: [Token]): syn.Identifier; export declare function IntType([tok]: [Token]): syn.IntType; export declare function BoolType([tok]: [Token]): syn.BoolType; export declare function StringType([tok]: [Token]): syn.StringType; export declare function CharType([tok]: [Token]): syn.CharType; export declare function VoidType([tok]: [Token]): syn.VoidType; export declare function PointerType([tp, s, tok]: [syn.Type, WS, Token]): syn.PointerType; export declare function ArrayType([tp, s1, l, s2, r]: [syn.Type, WS, Token, WS, Token]): syn.ArrayType; export declare function StructType([str, s, id]: [Token, WS, syn.Identifier]): syn.StructType; export declare function IntLiteral([tok]: Token[]): syn.IntLiteral; export declare function StringLiteral([[start, toks, end]]: [[Token, [Token][], Token]]): syn.StringLiteral; export declare function CharLiteral([[start, [tok], end]]: [[Token, [Token], Token]]): syn.CharLiteral; export declare function BoolLiteral([tok]: [Token]): syn.BoolLiteral; export declare function NullLiteral([tok]: [Token]): syn.NullLiteral; export declare function ArrayMemberExpression([object, s1, l, s2, index, s3, r]: [syn.Expression, WS, Token, WS, syn.Expression, WS, Token]): syn.ArrayMemberExpression; export declare function StructMemberExpression([object, s1, deref, s2, field]: [syn.Expression, WS, [Token, Token] | Token, WS, syn.Identifier]): syn.StructMemberExpression; /** * Helper type and helper function for function arguments */ export declare type Arguments = [WS, null | [syn.Expression, [WS, Token, WS, syn.Expression][], WS]]; export declare function Arguments([s1, args]: Arguments): syn.Expression[]; export declare function CallExpression([f, ws, l, args, r]: [syn.Identifier, WS, Token, Arguments, Token]): syn.CallExpression; export declare function IndirectCallExpression([l1, s1, s, s2, f, s3, r1, s4, l2, args, r2]: [Token, WS, Token, WS, syn.Expression, WS, Token, WS, Token, Arguments, Token]): syn.IndirectCallExpression; export declare function UnaryExpression([operator, s, argument]: [[Token] | [Token, WS, syn.Type, WS, Token], Token, syn.Expression]): syn.UnaryExpression | syn.CastExpression; export declare function BinaryExpression([left, s1, opertoks, s2, right]: [syn.Expression, WS, Token[], WS, syn.Expression]): syn.BinaryExpression | syn.LogicalExpression | syn.AssignmentExpression; export declare function ConditionalExpression([test, s1, op1, s2, consequent, s3, op2, s4, alternate]: [syn.Expression, WS, Token, WS, syn.Expression, WS, Token, WS, syn.Expression]): syn.ConditionalExpression; export declare function AllocExpression([alloc, s1, l, s2, typ, s3, r]: [Token, WS, Token, WS, syn.Type, WS, Token]): syn.AllocExpression; export declare function AllocArrayExpression([alloc, s1, l, s2, typ, s3, c, s4, size, sp, r]: [Token, WS, Token, WS, syn.Type, WS, Token, WS, syn.Expression, WS, Token]): syn.AllocArrayExpression; export declare function ResultExpression([b, res]: [Token, Token]): syn.ResultExpression; export declare function LengthExpression([b, length, s1, l, s2, argument, s3, r]: [Token, Token, WS, Token, WS, syn.Expression, WS, Token]): syn.LengthExpression; export declare function HasTagExpression([b, hastag, s1, l, s2, typ, s3, c, s4, argument, s5, r]: [Token, Token, WS, Token, WS, syn.Type, WS, Token, WS, syn.Expression, WS, Token]): syn.HasTagExpression; /** * The next section are all the C0 statements that get initally parsed as expressions */ export declare function UpdateExpression([argument, s1, op]: [syn.Expression, WS, [Token]]): syn.UpdateExpression; export declare function AssertExpression([assert, s1, l, s2, test, s3, r]: [Token, WS, Token, WS, syn.Expression, WS, Token]): syn.AssertExpression; export declare function ErrorExpression([error, s1, l, s2, argument, s3, r]: [Token, WS, Token, WS, syn.Expression, WS, Token]): syn.ErrorExpression; export declare type SimpleParsed = syn.Expression | [syn.Type, WS, syn.Identifier, null | [WS, Token, WS, syn.Expression]]; export declare function SimpleStatement([stm, s, semi]: [SimpleParsed, WS, Token]): syn.VariableDeclaration | syn.ExpressionStatement; export declare type AnnosAndStm = [syn.AnnoStatement[], syn.Statement]; export declare type Wrapper = { tag: "while"; start: Position; test: syn.Expression; } | { tag: "for"; start: Position; init: null | syn.ExpressionStatement | syn.VariableDeclaration; test: syn.Expression; update: null | syn.Expression; } | { tag: "ifelse"; start: Position; test: syn.Expression; consequent: AnnosAndStm; }; export declare function IfElse([tIF, s1, l, s2, test, s3, r, s4, stm, s5, tELSE, s6]: [Token, WS, Token, WS, syn.Expression, WS, Token, WS, AnnosAndStm, WS, Token, WS]): Wrapper; export declare function For([tFOR, s1, l, init, s2, semi1, s3, test, s4, semi2, update, s5, r, s6]: [Token, WS, Token, null | [WS, SimpleParsed], WS, Token, WS, syn.Expression, WS, Token, null | [WS, syn.Expression], WS, Token, WS]): Wrapper; export declare function While([tWHILE, s1, l, s2, test, s3, r, s4]: [Token, WS, Token, WS, syn.Expression, WS, Token, WS]): Wrapper; export declare function TopSimple([stms, annos, s1, stm, s2]: [[WS, AnnosAndStm][], syn.AnnoStatement[], WS, SimpleParsed, WS]): syn.Statement[]; export declare function TopStatement([stms, annos, s2]: [[WS, AnnosAndStm][], syn.AnnoStatement[], WS]): syn.Statement[]; export declare function Statement([wrappers, annos, stm]: [[syn.AnnoStatement[], Wrapper][], syn.AnnoStatement[], [syn.Statement]]): AnnosAndStm; export declare function IfStatement([tIF, s1, l, s2, test, s3, r, s4, consequent]: [Token, WS, Token, WS, syn.Expression, WS, Token, WS, AnnosAndStm]): syn.IfStatement; export declare function ReturnStatement([r, argument, s1, semi]: [Token, null | [WS, syn.Expression], WS, Token]): syn.ReturnStatement; export declare function BlockStatement([l, stms, annos, s, r]: [Token, [WS, [syn.AnnoStatement[], syn.Statement]][], syn.AnnoStatement[], WS, Token]): syn.BlockStatement; export declare function BreakStatement([stm, s1, semi]: [Token, WS, Token]): syn.BreakStatement; export declare function ContinueStatement([stm, s1, semi]: [Token, WS, Token]): syn.ContinueStatement; export declare function Anno([anno, s1, test, s2, semi, s3]: [[Token], WS, syn.Expression, WS, Token, WS]): syn.AnnoStatement; export declare function AnnoSet(annos: [Token, WS, syn.AnnoStatement[], Token, undefined, undefined] | [Token, WS, syn.AnnoStatement[], Token, any, Token]): syn.AnnoStatement[]; export declare function FunctionDeclarationArgs([s1, params]: [WS, null | [syn.Type, WS, syn.Identifier, WS, [Token, WS, syn.Type, WS, syn.Identifier, WS][]]]): syn.VariableDeclarationOnly[]; export declare function StructDeclaration([struct, s1, s, s2, semi]: [Token, WS, syn.Identifier, WS, Token]): syn.StructDeclaration; export declare function StructDefinition([struct, s1, s, s2, l, s3, defs, r, s5, semi]: [Token, WS, syn.Identifier, WS, Token, WS, [syn.Type, WS, syn.Identifier, WS, Token, WS][], Token, WS, Token]): syn.StructDeclaration; export declare function TypeDefinition([typedef, s1, tp, s2, id]: [Token, WS, syn.Type, WS, syn.Identifier]): syn.TypeDefinition; export declare function FunctionTypeDefinition([typedef, s1, ty, s2, f, s3, l, args, r, annos]: [Token, WS, syn.Type, WS, syn.Identifier, WS, Token, syn.VariableDeclarationOnly[], Token, syn.AnnoStatement[]]): syn.FunctionTypeDefinition; export declare function FunctionDeclaration([ty, s1, f, s2, l, args, r, annos, s3, def]: [syn.Type, WS, syn.Identifier, WS, Token, syn.VariableDeclarationOnly[], Token, syn.AnnoStatement[], WS, null | syn.BlockStatement]): syn.FunctionDeclaration;