using csmic; using System.Text; using System.Collections.Generic; COMPILER SCRIPT /* * * Class Structures * */ private MacroOperation root = new MacroOperation(OperationType.Unknown); internal MacroOperation Root { get { return this.root; } set { this.root = value; } } bool IsFunctionCall() { scanner.ResetPeek(); Token next = scanner.Peek(); if (next.kind == _LPAREN && la.kind == _identifier) return true; return false; } bool IsCompare() { scanner.ResetPeek(); Token next = scanner.Peek(); if (next.kind == _COMPARER) return true; return false; } bool IsAssignment() { scanner.ResetPeek(); Token next = scanner.Peek(); if (next.val == "::" || next.val == ":=" || next.val == "->") return true; return false; } bool IsArrayCall() { scanner.ResetPeek(); Token next = scanner.Peek(); if(next.val == "[") return true; return false; } CHARACTERS UpperLetter = 'A'..'Z'. LowerLetter = 'a'..'z'. letter = UpperLetter + LowerLetter. NoQuote = ANY - '\"' . digit = "0123456789" . cr = '\r' . lf = '\n' . tab = '\t' . PM = "+-" . TOKENS identifier = letter { letter | digit }. sign = PM . binary = ( '0' | '1' ) { '0' | '1' } ('B' | 'b') . hex = "0x" ( digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') ) { digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') } . number = digit { digit }['.' {digit}] [('E'|'e')['+'|'-'] digit {digit}] . newline = [cr] lf . string = "\"" { NoQuote } "\"" . LPAREN = '(' . RPAREN = ')' . COMPARER = "==" | "<" | ">" | "<=" | ">=" . COMMENTS FROM "/*" TO "*/" NESTED COMMENTS FROM "//" TO lf IGNORE cr + lf + tab /* * Parser specification * */ PRODUCTIONS SCRIPT (. string statement = string.Empty; .) = { Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); this.root.Children.Add(operation); .) | IfBlock | WhileBlock | FunctionDeclaration | EchoStatement | SayStatement | DisplayStatement | ForBlock } . IfBlock (. MacroOperation ifBlock = new MacroOperation(OperationType.If); MacroOperation elseBlock = new MacroOperation(OperationType.Else); string ifStatement = string.Empty; string statement = string.Empty; StringBuilder builder = new StringBuilder(); bool hasElse = false; .) = "if" LPAREN Comparison (. ifStatement = builder.ToString(); ifBlock.Input.Add(ifStatement); .) RPAREN '{' { Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); ifBlock.Children.Add(operation); .) | IfBlock | WhileBlock | EchoStatement | SayStatement | DisplayStatement | ForBlock } '}' [ "else" (. hasElse = true; .) '{' { Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); elseBlock.Children.Add(operation); .) | IfBlock | WhileBlock | EchoStatement | SayStatement | DisplayStatement | ForBlock } '}' ] (. if(hasElse) { MacroOperation ifelse = new MacroOperation(OperationType.IfElse); ifelse.Children.Add(ifBlock); ifelse.Children.Add(elseBlock); parent.Children.Add(ifelse); } else { parent.Children.Add(ifBlock); } .) . WhileBlock (. StringBuilder builder = new StringBuilder(); MacroOperation whileBlock = new MacroOperation(OperationType.While); string statement = string.Empty; .) = "while" LPAREN Comparison (. whileBlock.Input.Add(builder.ToString()); .) RPAREN '{' { Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); whileBlock.Children.Add(operation); .) | IfBlock | WhileBlock | EchoStatement | SayStatement | DisplayStatement | ForBlock } '}' (. parent.Children.Add(whileBlock); .) . ForBlock (. StringBuilder builder = new StringBuilder(); string statement = string.Empty; string statement2 = string.Empty; MacroOperation forBlock = new MacroOperation(OperationType.For); .) = "for" LPAREN Statement ',' Comparison ',' Statement (. forBlock.Input.Add(statement); forBlock.Input.Add(builder.ToString()); forBlock.Input.Add(statement2); .) RPAREN '{' { Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); forBlock.Children.Add(operation); .) | IfBlock | WhileBlock | EchoStatement | SayStatement | DisplayStatement | ForBlock } '}' (. parent.Children.Add(forBlock); .) . FunctionDeclaration (. StringBuilder builder = new StringBuilder(); string statement = string.Empty; MacroOperation func = new MacroOperation(OperationType.FunctionDeclaration); .) = "function" LPAREN CommaList (. string[] args = builder.ToString().Split(','); func.Input.AddRange(args); .) RPAREN '{' { Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); func.Children.Add(operation); .) | IfBlock | WhileBlock | EchoStatement | SayStatement | DisplayStatement | ForBlock } '}' (. parent.Children.Add(func); .) . EchoStatement (. StringBuilder builder = new StringBuilder(); MacroOperation echoStatement = new MacroOperation(OperationType.Echo); string statement = string.Empty; .) = "echo:" Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); echoStatement.Children.Add(operation); parent.Children.Add(echoStatement); .) . SayStatement (. StringBuilder builder = new StringBuilder(); MacroOperation sayStatement = new MacroOperation(OperationType.Say); string statement = string.Empty; .) = "say:" string (. statement = t.val.Replace("\"", ""); sayStatement.Input.Add(statement); parent.Children.Add(sayStatement); .) . DisplayStatement (. StringBuilder builder = new StringBuilder(); MacroOperation displayStatement = new MacroOperation(OperationType.Display); string statement = string.Empty; .) = "display:" ( Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); displayStatement.Children.Add(operation); .) | string (. statement = t.val.Replace("\"", ""); MacroOperation operation = new MacroOperation(OperationType.String); operation.Input.Add(statement); displayStatement.Children.Add(operation); .) ) { ',' ( Statement (. MacroOperation operation = new MacroOperation(OperationType.Statement); operation.Input.Add(statement); displayStatement.Children.Add(operation); .) | string (. statement = t.val.Replace("\"", ""); MacroOperation operation = new MacroOperation(OperationType.String); operation.Input.Add(statement); displayStatement.Children.Add(operation); .) ) } (. parent.Children.Add(displayStatement); .) . Statement (. value = string.Empty; StringBuilder builder = new StringBuilder(); .) = IF(IsAssignment()) Assignment (. value = builder.ToString(); .) | Expression (. value = builder.ToString(); .) . Expression = Term { '+' (. builder.Append(t.val); .) Term | '-' (. builder.Append(t.val); .) Term | '%' (. builder.Append(t.val); .) Term } . Term = Factor { '*' (. builder.Append(t.val); .) Factor | '/' (. builder.Append(t.val); .) Factor } . Factor = Value { '^' (. builder.Append(t.val); .) Value } . Value = [ "+" (. builder.Append(t.val); .) | "-" (. builder.Append(t.val); .) ] ( IF(IsFunctionCall()) Function | IF(IsArrayCall()) ArrayCall | identifier (. builder.Append(t.val); .) | number (. builder.Append(t.val); .) | hex (. builder.Append(t.val); .) | binary (. builder.Append(t.val); .) | '(' (. builder.Append(t.val); .) Expression ')' (. builder.Append(t.val); .) ) . ArrayL = '[' (. builder.Append(t.val); .) CommaList ']' (. builder.Append(t.val); .) . CommaList = Expression { ',' (. builder.Append(t.val); .) Expression } . Assignment = identifier (. builder.Append(t.val); .) ( ( "::" (. builder.Append(t.val); .) Expression ) | ( ":=" (. builder.Append(t.val); string value = string.Empty; .) AnyExpression (. builder.Append(value); .) newline ) | ( "->" (. builder.Append(t.val); .) ArrayL ) ) . Function = identifier (. builder.Append(t.val); .) '(' (. builder.Append(t.val); .) CommaList ')' (. builder.Append(t.val); .) . ArrayCall = identifier (. builder.Append(t.val); .) '[' (. builder.Append(t.val); .) Expression ']' (. builder.Append(t.val); .) . Comparison = Expression COMPARER (. result.Append(t.val); .) Expression . AnyExpression (. value = string.Empty; StringBuilder builder = new StringBuilder(); .) = ANY (. builder.Append(t.val); .) { ANY (. builder.Append(t.val); .) } '\n' (. value = builder.ToString(); .) . END SCRIPT.