void Imperative_unaryop(out DesignScript.Parser.Imperative.IDEHelpNode op) { op = new DesignScript.Parser.Imperative.IDEHelpNode(DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode); if (la.kind == 11) { Get(); op.setValue(t.col, t.line, t.val); } else if (la.kind == 65) { Get(); op.setValue(t.col, t.line, t.val); #if ENABLE_INC_DEC_FIX } else if (la.kind == 66 || la.kind == 67) { Imperative_PostFixOp(ref op); #endif } else SynErr(121); #if ENABLE_INC_DEC_FIX #else if (la.val == "++" || la.val == "--") Get(); #endif }
void Imperative_stmt(out Node node) { node = null; if (isFunctionCall()) { Imperative_functioncall(out node); Expect(20); DesignScript.Parser.Imperative.FunctionCallNode fcNode = node as DesignScript.Parser.Imperative.FunctionCallNode; fcNode.EndlinePos.setValue(t.col, t.line, t.val); node = fcNode; } else if (la.kind == 1 || la.kind == 9 || la.kind == 50) { Imperative_assignstmt(out node); } else if (la.kind == 32) { Imperative_ifstmt(out node); } else if (la.kind == 35) { Imperative_whilestmt(out node); } else if (la.kind == 36) { Imperative_forloop(out node); } else if (la.kind == 7) { Imperative_languageblock(out node); } else if (la.kind == 45) { Get(); DesignScript.Parser.Imperative.BreakNode bnode = new DesignScript.Parser.Imperative.BreakNode(); if (t.kind == _Kw_break) bnode.KwBreak.setValue(t.col, t.line, t.val); Expect(20); if (t.kind == _endline) bnode.EndLine.setValue(t.col, t.line, t.val); node = bnode; } else if (la.kind == 46) { Get(); DesignScript.Parser.Imperative.ContinueNode cnode = new DesignScript.Parser.Imperative.ContinueNode(); if (t.kind == _Kw_continue) cnode.KwContinue.setValue(t.col, t.line, t.val); Expect(20); if (t.kind == _endline) cnode.EndLine.setValue(t.col, t.line, t.val); node = cnode; } else if (la.kind == 20) { Get(); DesignScript.Parser.Imperative.IDEHelpNode endlineNode = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; node = endlineNode; } else SynErr(107); }
void Imperative_term(out Node node) { node = null; Imperative_interimfactor(out node); while (la.kind == 58 || la.kind == 59 || la.kind == 60) { Operator op; Imperative_mulop(out op); DesignScript.Parser.Imperative.IDEHelpNode operatorPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; Node rhsNode = null; Imperative_interimfactor(out rhsNode); DesignScript.Parser.Imperative.BinaryExpressionNode bNode = new DesignScript.Parser.Imperative.BinaryExpressionNode(); bNode.LeftNode = node; bNode.RightNode = rhsNode; bNode.Optr = op; bNode.Col = node.Col; bNode.Line = node.Line; bNode.OperatorPos = operatorPos; node = bNode; } }
void Imperative_NameReference(out Node node) { node = null; DesignScript.Parser.Imperative.ArrayNode array = null; if (la.kind == 9) { Imperative_parenExp(out node); } else if (la.kind == 1 || la.kind == 50) { if (isFunctionCall()) { Imperative_functioncall(out node); } else if (la.kind == 1) { Imperative_Ident(out node); } else { DesignScript.Parser.Imperative.ExprListNode exprlist = new DesignScript.Parser.Imperative.ExprListNode(); if (la.val == "{") exprlist.OpenCurlyBracePos.setValue(la.col, la.line, la.val); Get(); if (StartOf(18)) { Imperative_expr(out node); exprlist.list.Add(node); exprlist.Col = t.col; exprlist.Line = t.line; while (la.kind == 52) { Get(); DesignScript.Parser.Imperative.IDEHelpNode commaPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; exprlist.ExprCommaPosList.Add(commaPos); Imperative_expr(out node); exprlist.list.Add(node); } } if (la.val == "}" && exprlist.OpenCurlyBracePos.Value != null) exprlist.CloseCurlyBracePos.setValue(la.col, la.line, la.val); else if (la.val != "}") exprlist.OpenCurlyBracePos.Value = null; Expect(51); node = exprlist; } } else SynErr(118); if (la.kind == 7) { Imperative_arrayIndices(out array); array.Ident = node; node = array; } }
void Imperative_negop(out DesignScript.Parser.Imperative.IDEHelpNode op) { op = new DesignScript.Parser.Imperative.IDEHelpNode(DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode); if (la.kind == 1 || la.kind == 9 || la.kind == 50) { } else if (la.kind == 12) { Get(); op.setValue(t.col, t.line, t.val); } else SynErr(123); }
void Imperative_languageblock(out Node node) { node = null; DesignScript.Parser.Imperative.LanguageBlockNode langblock = new DesignScript.Parser.Imperative.LanguageBlockNode(); if (la.val == "[") langblock.OpenParenPos.setValue(la.col, la.line, la.val); Expect(7); langblock.Col = t.col; langblock.Line = t.line; Expect(1); if (t.val == "Imperative" || t.val == "Associative") langblock.IdentPos.setValue(t.col, t.line, t.val); if( 0 == t.val.CompareTo("Imperative")) { langblock.CodeBlock.language = ProtoCore.Language.kImperative; } else if( 0 == t.val.CompareTo("Associative")) { langblock.CodeBlock.language = ProtoCore.Language.kAssociative; } while (la.kind == 52) { Get(); string key; DesignScript.Parser.Imperative.IDEHelpNode commaPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; langblock.ParaPosList.Add(commaPos); Expect(1); key = t.val; DesignScript.Parser.Imperative.IDEHelpNode identPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.IdentNode }; langblock.ParaPosList.Add(identPos); Expect(53); DesignScript.Parser.Imperative.IDEHelpNode assignPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; langblock.ParaPosList.Add(assignPos); Expect(4); DesignScript.Parser.Imperative.StringNode textstringPos = new DesignScript.Parser.Imperative.StringNode() { Col = t.col, Line = t.line, value = t.val }; langblock.TextStringList.Add(textstringPos); if ("fingerprint" == key) { langblock.CodeBlock.fingerprint = t.val; langblock.CodeBlock.fingerprint = langblock.CodeBlock.fingerprint.Remove(0,1); langblock.CodeBlock.fingerprint = langblock.CodeBlock.fingerprint.Remove(langblock.CodeBlock.fingerprint.Length-1,1); } else if ("version" == key) { langblock.CodeBlock.version = t.val; langblock.CodeBlock.version = langblock.CodeBlock.version.Remove(0,1); langblock.CodeBlock.version = langblock.CodeBlock.version.Remove(langblock.CodeBlock.version.Length-1,1); } } if (la.val == "]" && langblock.OpenParenPos.Value != null) langblock.CloseParenPos.setValue(la.col, la.line, la.val); else if (la.val != "]") langblock.OpenParenPos.Value = null; Expect(8); if (la.val == "{") langblock.OpenCurlyBracePos.setValue(la.col, la.line, la.val); Expect(50); Node codeBlockNode = null; if (langblock.CodeBlock.language == ProtoCore.Language.kAssociative ) { Hydrogen(out codeBlockNode); } else if (langblock.CodeBlock.language == ProtoCore.Language.kImperative ) { Imperative(out codeBlockNode); } else SynErr(109); if (langblock.CodeBlock.language == ProtoCore.Language.kInvalid ) { int openCurlyBraceCount = 0, closeCurlyBraceCount = 0; DesignScript.Parser.Imperative.CodeBlockNode codeBlockInvalid = new DesignScript.Parser.Imperative.CodeBlockNode(); while (closeCurlyBraceCount <= openCurlyBraceCount) { if (la.kind == 7) { Imperative_languageblock(out codeBlockNode); codeBlockInvalid.Body.Add(codeBlockNode); } else if (la.kind == 50) { Get(); openCurlyBraceCount++; } else if (la.kind == 51) { if (la.val == "}" && langblock.OpenCurlyBracePos.Value != null) langblock.CloseCurlyBracePos.setValue(la.col, la.line, la.val); else if(la.val != "}") langblock.OpenCurlyBracePos.Value = null; Get(); closeCurlyBraceCount++; } else if (la.kind == 0) { Get(); Expect(51); break; } else if (true) { Get(); } else SynErr(110); } codeBlockNode = codeBlockInvalid; } else if (true) { if (la.val == "}" && langblock.OpenCurlyBracePos.Value != null) langblock.CloseCurlyBracePos.setValue(la.col, la.line, la.val); else if(la.val != "}") langblock.OpenCurlyBracePos.Value = null; Expect(51); } else SynErr(111); langblock.CodeBlockNode = codeBlockNode; node = langblock; }
void Imperative_logicalexpr(out Node node) { node = null; Imperative_RangeExpr(out node); while (StartOf(14)) { Operator op; Imperative_relop(out op); DesignScript.Parser.Imperative.IDEHelpNode operatorPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; Node rhsNode = null; Imperative_RangeExpr(out rhsNode); DesignScript.Parser.Imperative.BinaryExpressionNode bNode = new DesignScript.Parser.Imperative.BinaryExpressionNode(); bNode.LeftNode = node; bNode.RightNode = rhsNode; bNode.Optr = op; bNode.Col = node.Col; bNode.Line = node.Line; bNode.OperatorPos = operatorPos; node = bNode; } }
void Imperative_identifierList(out Node node) { node = null; Imperative_NameReference(out node); while (la.kind == 6) { Get(); Node rnode = null; DesignScript.Parser.Imperative.IDEHelpNode dotPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; Imperative_NameReference(out rnode); DesignScript.Parser.Imperative.IdentifierListNode bnode = new DesignScript.Parser.Imperative.IdentifierListNode(); List<DesignScript.Parser.Imperative.IDEHelpNode> dotPosList = new List<DesignScript.Parser.Imperative.IDEHelpNode>(); dotPosList.Add(dotPos); bnode.LeftNode = node; bnode.Optr = Operator.dot; bnode.RightNode = rnode; bnode.Col = node.Col; bnode.Line = node.Line; bnode.DotPosList = dotPosList; node = bnode; } }
void Imperative_functiondecl(out Node node) { DesignScript.Parser.Imperative.FunctionDefinitionNode funcDecl = new DesignScript.Parser.Imperative.FunctionDefinitionNode(); Expect(25); funcDecl.KeywordPos.setValue(t.col, t.line, t.val); funcDecl.Col = t.col; funcDecl.Line = t.line; Expect(1); funcDecl.Name = t.val; funcDecl.NamePos.setValue(t.col, t.line, t.val); if (la.kind == 54) { Get(); funcDecl.TypeColonPos = new DesignScript.Parser.Imperative.IDEHelpNode(); funcDecl.TypeColonPos.setValue(t.col, t.line, t.val); funcDecl.ReturnTypePos = new DesignScript.Parser.Imperative.IDEHelpNode(); if (StartOf(12)) { if (la.kind == 38) { Get(); } else if (la.kind == 37) { Get(); } else if (la.kind == 39) { Get(); } else { Get(); } funcDecl.ReturnTypePos.Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.KeywordNode; } else if (la.kind == 1) { Get(); funcDecl.ReturnTypePos.Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.TypeNode; } else SynErr(108); funcDecl.ReturnType = new ProtoCore.Type() { Name = t.val }; funcDecl.ReturnTypePos.setValue(t.col, t.line, t.val); while (la.kind == 7) { string _open = null; int _open_line = 0; int _open_col = 0; string _close = null; if (la.val == "[") { _open = la.val; _open_line = la.line; _open_col = la.col; } Get(); if(la.val == "]") _close = la.val; Expect(8); if (_open != null && _close != null) { funcDecl.Brackets.Add(new DesignScript.Parser.Imperative.IDEHelpNode() { Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode, Value = _open, Line = _open_line, Col = _open_col }); funcDecl.Brackets.Add(new DesignScript.Parser.Imperative.IDEHelpNode() { Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode, Value = _close, Line = t.line, Col = t.col }); } } } if (la.val == "(") funcDecl.OpenParenPos.setValue(la.col, la.line, la.val); Expect(9); if (la.kind == 1) { DesignScript.Parser.Imperative.ArgumentSignatureNode args = new DesignScript.Parser.Imperative.ArgumentSignatureNode(); args.Col = t.col; args.Line = t.line; Node argdecl = null; Imperative_vardecl(out argdecl); args.AddArgument(argdecl as DesignScript.Parser.Imperative.VarDeclNode); while (la.kind == 52) { Get(); DesignScript.Parser.Imperative.IDEHelpNode commaPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; funcDecl.ArgCommaPosList.Add(commaPos); Imperative_vardecl(out argdecl); args.AddArgument(argdecl as DesignScript.Parser.Imperative.VarDeclNode); } funcDecl.Signature = args; } if (la.val == ")" && funcDecl.OpenParenPos.Value != null) funcDecl.CloseParenPos.setValue(la.col, la.line, la.val); else if (la.val != ")") funcDecl.OpenParenPos.Value = null; Expect(10); isGlobalScope = false; if (la.val == "{") funcDecl.OpenCurlyBracePos.setValue(la.col, la.line, la.val); Expect(50); funcDecl.FunctionBody = new DesignScript.Parser.Imperative.CodeBlockNode(); funcDecl.FunctionBody.Col = t.col; funcDecl.FunctionBody.Line = t.line; List<Node> body = null; Imperative_stmtlist(out body); if (la.val == "}" && funcDecl.OpenCurlyBracePos.Value != null) funcDecl.CloseCurlyBracePos.setValue(la.col, la.line, la.val); else if (la.val != "}") funcDecl.OpenCurlyBracePos.Value = null; Expect(51); funcDecl.localVars = localVarCount; funcDecl.FunctionBody.Body = body; node = funcDecl; isGlobalScope = true; localVarCount= 0; }
void Imperative_functioncall(out Node node) { Expect(1); DesignScript.Parser.Imperative.IdentifierNode function = new DesignScript.Parser.Imperative.IdentifierNode() { Value = t.val, Name = t.val, Col = t.col, Line = t.line }; List<Node> arglist = new List<Node>(); List<DesignScript.Parser.Imperative.IDEHelpNode> argCommaPosList = new List<DesignScript.Parser.Imperative.IDEHelpNode>(); DesignScript.Parser.Imperative.IDEHelpNode openParenPos = null; DesignScript.Parser.Imperative.IDEHelpNode closeParenPos = null; if (la.val == "(") openParenPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = la.col, Line = la.line, Value = la.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; Expect(9); if (StartOf(18)) { Node argNode = null; Imperative_expr(out argNode); arglist.Add(argNode); while (la.kind == 52) { Get(); DesignScript.Parser.Imperative.IDEHelpNode commaPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; argCommaPosList.Add(commaPos); Imperative_expr(out argNode); arglist.Add(argNode); } } if (la.val == ")" && openParenPos != null) closeParenPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = la.col, Line = la.line, Value = la.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; else if (la.val != ")") openParenPos = null; Expect(10); DesignScript.Parser.Imperative.FunctionCallNode funcNode = new DesignScript.Parser.Imperative.FunctionCallNode(); funcNode.Col = function.Col; funcNode.Line = function.Line; funcNode.OpenParenPos = openParenPos; funcNode.CloseParenPos = closeParenPos; funcNode.ArgCommaPosList = argCommaPosList; funcNode.Function = function; funcNode.FormalArguments = arglist; node = funcNode; }
void Imperative_assignstmt(out Node node) { node = null; Node lhsNode = null; isLeft = true; Imperative_DecoratedIdentifier(out lhsNode); node = lhsNode; isLeft = false; if (!(lhsNode is DesignScript.Parser.Imperative.PostFixNode)) { DesignScript.Parser.Imperative.IDEHelpNode operatorPos = null; Expect(53); if (t.val == "=") operatorPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; DesignScript.Parser.Imperative.IDEHelpNode endline = null; Node rhsNode = null; if (la.val == "[") { Imperative_languageblock(out rhsNode); } else if (HasMoreAssignmentStatements()) { Imperative_assignstmt(out rhsNode); } else if (StartOf(18)) { Imperative_expr(out rhsNode); Expect(20); if (t.kind == _endline) endline = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = t.col, Line = t.line, Value = t.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; } else SynErr(112); DesignScript.Parser.Imperative.BinaryExpressionNode bNode = new DesignScript.Parser.Imperative.BinaryExpressionNode(); bNode.LeftNode = lhsNode; bNode.RightNode = rhsNode; bNode.Optr = Operator.assign; bNode.OperatorPos = operatorPos; bNode.Col = lhsNode.Col; bNode.Line = lhsNode.Line; bNode.EndlinePos = endline; node = bNode; } }
void Imperative_arrayIndices(out DesignScript.Parser.Imperative.ArrayNode array) { array = new DesignScript.Parser.Imperative.ArrayNode(); DesignScript.Parser.Imperative.IDEHelpNode openBracketPos = null; if (la.val == "[") openBracketPos = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = la.col, Line = la.line, Value = la.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; Expect(7); Node node = null; if (StartOf(18)) { Imperative_expr(out node); } array.Col = t.col; array.Line = t.line; array.OpenBracketPos = openBracketPos; array.Expr = node; array.Type = null; if (la.val == "]" && array.OpenBracketPos != null) array.CloseBracketPos.setValue(la.col, la.line, la.val); else if (la.val != "]") array.OpenBracketPos = null; Expect(8); while (la.kind == 7) { DesignScript.Parser.Imperative.IDEHelpNode openBracketPos2 = null; if (la.val == "[") openBracketPos2 = new DesignScript.Parser.Imperative.IDEHelpNode() { Col = la.col, Line = la.line, Value = la.val, Type = DesignScript.Parser.Imperative.IDEHelpNode.HelpNodeType.PunctuationNode }; Get(); node = null; if (StartOf(18)) { Imperative_expr(out node); } DesignScript.Parser.Imperative.ArrayNode array2 = new DesignScript.Parser.Imperative.ArrayNode(); array2.Col = t.col; array2.Line = t.line; array2.OpenBracketPos = openBracketPos2; array2.Expr = node; array2.Type = array; if (la.val == "]" && array2.OpenBracketPos != null) array2.CloseBracketPos.setValue(la.col, la.line, la.val); else if (la.val != "]") array2.OpenBracketPos = null; Expect(8); array = array2; } }