From 509ad46db09ea6af48779303bfb18a89ebc87d08 Mon Sep 17 00:00:00 2001 From: DanBarkus Date: Sun, 8 Aug 2021 09:36:09 -0400 Subject: [PATCH] Added lexer for parsing GSQL files (#1866) * Added GSQL lexer * encased keywords in 'words' function added link to language reference * added additional word functions * Added copyright annotation Removed commented out string * re-built test output file * Updated words to Keywords --- pygments/lexers/_mapping.py | 1 + pygments/lexers/gsql.py | 92 ++ tests/examplefiles/gsql/test.gsql | 223 ++++ tests/examplefiles/gsql/test.gsql.output | 1503 ++++++++++++++++++++++ 4 files changed, 1819 insertions(+) create mode 100755 pygments/lexers/gsql.py create mode 100755 tests/examplefiles/gsql/test.gsql create mode 100644 tests/examplefiles/gsql/test.gsql.output diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index 4c6fb01304..4dc2615c49 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -175,6 +175,7 @@ 'GAPLexer': ('pygments.lexers.algebra', 'GAP', ('gap',), ('*.g', '*.gd', '*.gi', '*.gap'), ()), 'GDScriptLexer': ('pygments.lexers.gdscript', 'GDScript', ('gdscript', 'gd'), ('*.gd',), ('text/x-gdscript', 'application/x-gdscript')), 'GLShaderLexer': ('pygments.lexers.graphics', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)), + 'GSQLLexer': ('pygments.lexers.gsql', 'GSQL', ('gsql',), ('*.gsql',), ()), 'GasLexer': ('pygments.lexers.asm', 'GAS', ('gas', 'asm'), ('*.s', '*.S'), ('text/x-gas',)), 'GcodeLexer': ('pygments.lexers.gcodelexer', 'g-code', ('gcode',), ('*.gcode',), ()), 'GenshiLexer': ('pygments.lexers.templates', 'Genshi', ('genshi', 'kid', 'xml+genshi', 'xml+kid'), ('*.kid',), ('application/x-genshi', 'application/x-kid')), diff --git a/pygments/lexers/gsql.py b/pygments/lexers/gsql.py new file mode 100755 index 0000000000..67816b8721 --- /dev/null +++ b/pygments/lexers/gsql.py @@ -0,0 +1,92 @@ +""" + pygments.lexers.gsql + ~~~~~~~~~~~~~~~~~~~~~~~ + + Lexers for TigerGraph GSQL graph query language + + :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re + +from pygments.lexer import RegexLexer, include, bygroups, using, this, words +from pygments.token import Keyword, Punctuation, Comment, Operator, Name,\ + String, Number, Whitespace, Token + + +__all__ = ["GSQLLexer"] + +class GSQLLexer(RegexLexer): + + """ + For `GSQL `_ queries (version 3.x). + .. versionadded:: 2.10 + """ + + name = 'GSQL' + aliases = ['gsql'] + filenames = ['*.gsql'] + + flags = re.MULTILINE | re.IGNORECASE + + tokens = { + 'root': [ + include('comment'), + include('keywords'), + include('clauses'), + include('accums'), + include('relations'), + include('strings'), + include('whitespace'), + include('barewords'), + include('operators'), + ], + 'comment': [ + (r'.*\#.*\n', Comment.Single), + (r'.*\/\*\s*.*\s*\*\/', Comment.Multiline), + ], + 'keywords': [ + (words(( + 'ACCUM', 'AND', 'ANY', 'API', 'AS', 'ASC', 'AVG', 'BAG', 'BATCH', 'BETWEEN', 'BOOL', 'BOTH', + 'BREAK', 'BY', 'CASE', 'CATCH', 'COALESCE', 'COMPRESS', 'CONTINUE', 'COUNT', + 'CREATE', 'DATETIME', 'DATETIME_ADD', 'DATETIME_SUB', 'DELETE', 'DESC', 'DISTRIBUTED', 'DO', + 'DOUBLE', 'EDGE', 'ELSE', 'END', 'ESCAPE', 'EXCEPTION', 'FALSE', 'FILE', 'FILTER', 'FLOAT', 'FOREACH', 'FOR', + 'FROM', 'GRAPH', 'GROUP', 'GSQL_INT_MAX', 'GSQL_INT_MIN', 'GSQL_UINT_MAX', 'HAVING', 'IF', + 'IN', 'INSERT', 'INT', 'INTERPRET', 'INTERSECT', 'INTERVAL', 'INTO', 'IS', 'ISEMPTY', 'JSONARRAY', 'JSONOBJECT', 'LASTHOP', + 'LEADING', 'LIKE', 'LIMIT', 'LIST', 'LOAD_ACCUM', 'LOG', 'MAP', 'MATCH', 'MAX', 'MIN', 'MINUS', 'NOT', + 'NOW', 'NULL', 'OFFSET', 'OR', 'ORDER', 'PATH', 'PER', 'PINNED', 'POST_ACCUM', 'POST-ACCUM', 'PRIMARY_ID', 'PRINT', + 'QUERY', 'RAISE', 'RANGE', 'REPLACE', 'RESET_COLLECTION_ACCUM', 'RETURN', 'RETURNS', 'RUN', 'SAMPLE', 'SELECT', 'SELECT_VERTEX', + 'SET', 'SRC', 'STATIC', 'STRING', 'SUM', 'SYNTAX', 'TARGET', 'TAGSTGT', 'THEN', 'TO', 'TO_CSV', 'TO_DATETIME', 'TRAILING', 'TRIM', 'TRUE', + 'TRY', 'TUPLE', 'TYPEDEF', 'UINT', 'UNION', 'UPDATE', 'VALUES', 'VERTEX', 'WHEN', 'WHERE', 'WHILE', 'WITH'), prefix=r'(?|<-', Operator), + (r'[.*{}]', Punctuation), + ], + 'strings': [ + (r'"(?:\\[tbnrf\'"\\]|[^\\"])*"', String), + (r'@{1,2}\w+', Name.Variable), + (r'(\<\w+)?\<(\w+\>?\,?\s?)+\>+', Name.Constant), + ], + 'whitespace': [ + (r'\s+', Whitespace), + ], + 'barewords': [ + (r'[a-z]\w*', Name), + (r'(\d+\.\d+|\d+)', Number), + ], + 'operators': [ + (r'[^0-9|\/|\-](\-\=|\+\=|\*\=|\\\=|\=|\=\=|\=\=\=|\+|\-|\*|\\|\+\=|\>|\<)[^\>|\/]', Operator), + (r'(\(|\)|\,|\;|\=|\-|\+|\*|\/|\>|\<|\:)', Operator), + ], + } diff --git a/tests/examplefiles/gsql/test.gsql b/tests/examplefiles/gsql/test.gsql new file mode 100755 index 0000000000..c65ab93077 --- /dev/null +++ b/tests/examplefiles/gsql/test.gsql @@ -0,0 +1,223 @@ +CREATE QUERY Member_Likeness(VERTEX m1, STRING inDate) FOR GRAPH motionData { + # TYPEDEF TUPLE XYPair; + MapAccum, MapAccum> @@likenessAccum; + MapAccum, FLOAT> @@BirthYearAccum; + MapAccum, FLOAT> @@HeightAccum; + MapAccum, FLOAT> @@WeightAccum; + ListAccum> @@MemLocAccum; + MapAccum, FLOAT> @@LocAccum; + MapAccum, BagAccum>> @@DayIncentives; + MapAccum, MapAccum> @@MemberStats; + BagAccum> @MemberIncentives; + AvgAccum @@StepsAccum; + AvgAccum @@BoutsAccum; + AvgAccum @@MilesAccum; + + # Universal Vars + INT lastMax = 0; + INT lastMin = 1000; + FLOAT mult; + + # Age Vars + INT ageRange; + INT birthYear; + + # Height Vars + INT heightRange; + INT height; + + # Height Vars + INT weightRange; + INT weight; + + # Location Vars + FLOAT locRange; + VERTEX memLoc; + + # Activity Vars + DATETIME lastRecording; + + # lastRecording = to_datetime("2018-05-19"); + lastRecording = to_datetime(inDate); + + /* + + test comment block + + */ + + + members = {motionMember.*}; + + birthYear = Get_Birth_Year(m1); + height = m1.Height; + weight = m1.Weight; + temp = SELECT loc FROM members:member -(:e) - location: loc + WHERE member == m1 + ACCUM + @@MemLocAccum += loc; + FOREACH loc in @@MemLocAccum DO + memLoc = loc; + END; + + PRINT memLoc; + PRINT birthYear; + PRINT height; + PRINT weight; + + results = SELECT member FROM members:member + ACCUM + @@BirthYearAccum += (member -> abs(Get_Birth_Year(member) - birthYear)); + + FOREACH (member,bys) in @@BirthYearAccum DO + IF bys > lastMax THEN + lastMax = bys; + END; + IF bys < lastMin THEN + lastMin = bys; + END; + END; + + ageRange = lastMax - lastMin; + print ageRange; + mult = 1.0/ageRange; + + + FOREACH (member,bys) in @@BirthYearAccum DO + bys = 1 - bys * mult; + @@likenessAccum += (member -> ("age" -> bys)); + END; + + lastMax = 0; + lastMin = 1000; + mult = 0; + + results = SELECT member FROM members:member + ACCUM + @@HeightAccum += (member -> abs(member.Height - height)); + + FOREACH (member,heights) in @@HeightAccum DO + IF heights < height THEN + IF heights > lastMax THEN + lastMax = heights; + END; + IF heights < lastMin THEN + lastMin = heights; + END; + END; + END; + + heightRange = lastMax - lastMin; + print heightRange; + mult = 1.0/heightRange; + + + FOREACH (member,heights) in @@HeightAccum DO + IF heights < height THEN + heights = 1 - heights * mult; + ELSE + heights = 0; + END; + @@likenessAccum += (member -> ("height" -> heights)); + END; + + lastMax = 0; + lastMin = 1000; + mult = 0; + + results = SELECT member FROM members:member + ACCUM + @@WeightAccum += (member -> abs(member.Weight - weight)); + + FOREACH (member,weights) in @@WeightAccum DO + IF weights < weight THEN + IF weights > lastMax THEN + lastMax = weights; + END; + IF weights < lastMin THEN + lastMin = weights; + END; + END; + END; + + weightRange = lastMax - lastMin; + print weightRange; + mult = 1.0/weightRange; + + + FOREACH (member,weights) in @@WeightAccum DO + IF weights < weight THEN + weights = 1 - weights * mult; + ELSE + weights = 0; + END; + @@likenessAccum += (member -> ("weight" -> weights)); + END; + + lastMax = 0; + lastMin = 1000; + mult = 0; + + resultsLoc = SELECT loc FROM members:member -(:e) - location: loc + ACCUM + @@LocAccum += (member -> Check_Distance(loc,memLoc)); + FOREACH (member,loc) in @@LocAccum DO + IF loc < 5800 THEN + IF loc > lastMax THEN + lastMax = ceil(loc); + END; + IF loc < lastMin THEN + lastMin = floor(loc); + END; + END; + END; + + PRINT lastMax; + PRINT lastMin; + + locRange = lastMax - lastMin; + print locRange; + mult = 1.0/locRange; + + FOREACH (member,loc) in @@LocAccum DO + IF loc > 5800 THEN + loc = -1; + ELSE + loc = 1 - loc * mult; + END; + @@likenessAccum += (member -> ("distance" -> loc)); + END; + + lastMax = 0; + lastMin = 1000; + mult = 0; + + incentives = {incentive.*}; + + incentives = SELECT incent FROM incentives:incent - (:e) - lookupRule:rule WHERE + rule.RuleName == "Tenacity" AND incent.IncentiveDate > datetime_sub(lastRecording, INTERVAL 1 MONTH) AND incent.IncentiveDate < lastRecording; + + members = SELECT member FROM incentives:incent - (:e) - motionMember:member + ACCUM + @@DayIncentives += (member -> (incent)); + + FOREACH (member, incent) IN @@DayIncentives DO + @@StepsAccum = 0; + FOREACH Incentive IN incent DO + @@StepsAccum += Incentive.TotalSteps; + @@BoutsAccum += Incentive.TotalBouts; + @@MilesAccum += Incentive.Miles; + END; + @@MemberStats += (member -> ("stepsAvg" -> @@StepsAccum)); + @@MemberStats += (member -> ("stepsSlope" -> Linear_Regression(incent, 1))); + # @@MemberStats += (member -> ("boutsAvg" -> @@BoutsAccum)); + # @@MemberStats += (member -> ("boutsSlope" -> Linear_Regression(incent, 2))); + @@MemberStats += (member -> ("milesAvg" -> @@MilesAccum)); + @@MemberStats += (member -> ("milesSlope" -> Linear_Regression(incent, 3))); + END; + + + PRINT @@MemberStats; + PRINT @@likenessAccum; + +} \ No newline at end of file diff --git a/tests/examplefiles/gsql/test.gsql.output b/tests/examplefiles/gsql/test.gsql.output new file mode 100644 index 0000000000..12f7ba0d69 --- /dev/null +++ b/tests/examplefiles/gsql/test.gsql.output @@ -0,0 +1,1503 @@ +'CREATE' Keyword +' ' Text.Whitespace +'QUERY' Keyword +' ' Text.Whitespace +'Member_Likeness' Name +'(' Operator +'VERTEX' Keyword +' ' Text.Whitespace +'' Name.Constant +' ' Text.Whitespace +'m1' Name +',' Operator +' ' Text.Whitespace +'STRING' Keyword +' ' Text.Whitespace +'inDate' Name +')' Operator +' ' Text.Whitespace +'FOR' Keyword +' ' Text.Whitespace +'GRAPH' Keyword +' ' Text.Whitespace +'motionData' Name +' ' Text.Whitespace +'{' Punctuation +' \n\t' Text.Whitespace +'# TYPEDEF TUPLE XYPair;\n' Comment.Single + +'\t' Text.Whitespace +'MapAccum' Name.Builtin +'' Name.Constant +',' Operator +' ' Text.Whitespace +'MapAccum' Name.Builtin +'>' Name.Constant +' ' Text.Whitespace +'@@likenessAccum' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'MapAccum' Name.Builtin +', FLOAT>' Name.Constant +' ' Text.Whitespace +'@@BirthYearAccum' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'MapAccum' Name.Builtin +', FLOAT>' Name.Constant +' ' Text.Whitespace +'@@HeightAccum' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'MapAccum' Name.Builtin +', FLOAT>' Name.Constant +' ' Text.Whitespace +'@@WeightAccum' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'ListAccum' Name.Builtin +'>' Name.Constant +' ' Text.Whitespace +'@@MemLocAccum' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'MapAccum' Name.Builtin +', FLOAT>' Name.Constant +' ' Text.Whitespace +'@@LocAccum' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'MapAccum' Name.Builtin +'' Name.Constant +',' Operator +' ' Text.Whitespace +'BagAccum' Name.Builtin +'>>' Name.Constant +' ' Text.Whitespace +'@@DayIncentives' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'MapAccum' Name.Builtin +'' Name.Constant +',' Operator +' ' Text.Whitespace +'MapAccum' Name.Builtin +'>' Name.Constant +' ' Text.Whitespace +'@@MemberStats' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'BagAccum' Name.Builtin +'>' Name.Constant +' ' Text.Whitespace +'@MemberIncentives' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'AvgAccum' Name.Builtin +' ' Text.Whitespace +'@@StepsAccum' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'AvgAccum' Name.Builtin +' ' Text.Whitespace +'@@BoutsAccum' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'AvgAccum' Name.Builtin +' ' Text.Whitespace +'@@MilesAccum' Name.Variable +';' Operator +'\n\t\n\t' Text.Whitespace +'# Universal Vars\n' Comment.Single + +'\t' Text.Whitespace +'INT' Keyword +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'INT' Keyword +' ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1000' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'FLOAT' Keyword +' ' Text.Whitespace +'mult' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'# Age Vars\n' Comment.Single + +'\t' Text.Whitespace +'INT' Keyword +' ' Text.Whitespace +'ageRange' Name +';' Operator +'\n\t' Text.Whitespace +'INT' Keyword +' ' Text.Whitespace +'birthYear' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'# Height Vars\n' Comment.Single + +'\t' Text.Whitespace +'INT' Keyword +' ' Text.Whitespace +'heightRange' Name +';' Operator +'\n\t' Text.Whitespace +'INT' Keyword +' ' Text.Whitespace +'height' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'# Height Vars\n' Comment.Single + +'\t' Text.Whitespace +'INT' Keyword +' ' Text.Whitespace +'weightRange' Name +';' Operator +'\n\t' Text.Whitespace +'INT' Keyword +' ' Text.Whitespace +'weight' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'# Location Vars\n' Comment.Single + +'\t' Text.Whitespace +'FLOAT' Keyword +' ' Text.Whitespace +'locRange' Name +';' Operator +'\n\t' Text.Whitespace +'VERTEX' Keyword +' ' Text.Whitespace +'memLoc' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'# Activity Vars\n' Comment.Single + +'\t' Text.Whitespace +'DATETIME' Keyword +' ' Text.Whitespace +'lastRecording' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'# lastRecording = to_datetime("2018-05-19");\n' Comment.Single + +'\t' Text.Whitespace +'lastRecording' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'to_datetime' Keyword +'(' Operator +'inDate' Name +')' Operator +';' Operator +'\n\n ' Text.Whitespace +'/*\n\n test comment block \n\n */' Comment.Multiline +'\n\t\n\t\n\t' Text.Whitespace +'members' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'{' Punctuation +'motionMember' Name +'.' Punctuation +'*' Punctuation +'}' Punctuation +';' Operator +'\n\t\n\t' Text.Whitespace +'birthYear' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'Get_Birth_Year' Name +'(' Operator +'m1' Name +')' Operator +';' Operator +'\n\t' Text.Whitespace +'height' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'m1' Name +'.' Punctuation +'Height' Name +';' Operator +'\n\t' Text.Whitespace +'weight' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'m1' Name +'.' Punctuation +'Weight' Name +';' Operator +'\n\t' Text.Whitespace +'temp' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'SELECT' Keyword +' ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'FROM' Keyword +' ' Text.Whitespace +'members' Name +':' Operator +'member' Name +' ' Text.Whitespace +'-' Operator +'(' Operator +':' Operator +'e' Name +')' Operator +' -' Operator +' ' Text.Whitespace +'location' Name +':' Operator +' ' Text.Whitespace +'loc' Name +'\n\t ' Text.Whitespace +'WHERE' Keyword +' ' Text.Whitespace +'member' Name +' ' Text.Whitespace +'== ' Operator +'m1' Name +'\n\t ' Text.Whitespace +'ACCUM' Keyword +' \n\t ' Text.Whitespace +'@@MemLocAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'loc' Name +';' Operator +'\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@MemLocAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'memLoc' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'loc' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t \n\t' Text.Whitespace +'PRINT' Keyword +' ' Text.Whitespace +'memLoc' Name +';' Operator +'\n\t' Text.Whitespace +'PRINT' Keyword +' ' Text.Whitespace +'birthYear' Name +';' Operator +'\n\t' Text.Whitespace +'PRINT' Keyword +' ' Text.Whitespace +'height' Name +';' Operator +'\n\t' Text.Whitespace +'PRINT' Keyword +' ' Text.Whitespace +'weight' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'results' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'SELECT' Keyword +' ' Text.Whitespace +'member' Name +' ' Text.Whitespace +'FROM' Keyword +' ' Text.Whitespace +'members' Name +':' Operator +'member' Name +'\n\t ' Text.Whitespace +'ACCUM' Keyword +' \n\t ' Text.Whitespace +'@@BirthYearAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'abs' Name +'(' Operator +'Get_Birth_Year' Name +'(' Operator +'member' Name +')' Operator +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'birthYear' Name +')' Operator +')' Operator +';' Operator +'\n\t\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +'bys' Name +')' Operator +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@BirthYearAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'bys' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'bys' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'bys' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'bys' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t' Text.Whitespace +'ageRange' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'lastMin' Name +';' Operator +'\n\t' Text.Whitespace +'print' Keyword +' ' Text.Whitespace +'ageRange' Name +';' Operator +'\n\t' Text.Whitespace +'mult' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1.0' Literal.Number +'/' Operator +'ageRange' Name +';' Operator +'\n\t\n\t\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +'bys' Name +')' Operator +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@BirthYearAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'bys' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1' Literal.Number +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'bys' Name +' ' Text.Whitespace +'*' Punctuation +' ' Text.Whitespace +'mult' Name +';' Operator +'\n\t ' Text.Whitespace +'@@likenessAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'"age"' Literal.String +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'bys' Name +')' Operator +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1000' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'mult' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t\n\t' Text.Whitespace +'results' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'SELECT' Keyword +' ' Text.Whitespace +'member' Name +' ' Text.Whitespace +'FROM' Keyword +' ' Text.Whitespace +'members' Name +':' Operator +'member' Name +'\n\t ' Text.Whitespace +'ACCUM' Keyword +' \n\t ' Text.Whitespace +'@@HeightAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'abs' Name +'(' Operator +'member' Name +'.' Punctuation +'Height' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'height' Name +')' Operator +')' Operator +';' Operator +'\n\t\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +'heights' Name +')' Operator +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@HeightAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'heights' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'height' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'heights' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'heights' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'heights' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'heights' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t' Text.Whitespace +'heightRange' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'lastMin' Name +';' Operator +'\n\t' Text.Whitespace +'print' Keyword +' ' Text.Whitespace +'heightRange' Name +';' Operator +'\n\t' Text.Whitespace +'mult' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1.0' Literal.Number +'/' Operator +'heightRange' Name +';' Operator +'\n\t\n\t\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +'heights' Name +')' Operator +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@HeightAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'heights' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'height' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'heights' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1' Literal.Number +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'heights' Name +' ' Text.Whitespace +'*' Punctuation +' ' Text.Whitespace +'mult' Name +';' Operator +'\n\t ' Text.Whitespace +'ELSE' Keyword +'\n\t ' Text.Whitespace +'heights' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'@@likenessAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'"height"' Literal.String +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'heights' Name +')' Operator +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1000' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'mult' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t\n\t' Text.Whitespace +'results' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'SELECT' Keyword +' ' Text.Whitespace +'member' Name +' ' Text.Whitespace +'FROM' Keyword +' ' Text.Whitespace +'members' Name +':' Operator +'member' Name +'\n\t ' Text.Whitespace +'ACCUM' Keyword +' \n\t ' Text.Whitespace +'@@WeightAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'abs' Name +'(' Operator +'member' Name +'.' Punctuation +'Weight' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'weight' Name +')' Operator +')' Operator +';' Operator +'\n\t\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +'weights' Name +')' Operator +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@WeightAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'weights' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'weight' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'weights' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'weights' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'weights' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'weights' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t' Text.Whitespace +'weightRange' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'lastMin' Name +';' Operator +'\n\t' Text.Whitespace +'print' Keyword +' ' Text.Whitespace +'weightRange' Name +';' Operator +'\n\t' Text.Whitespace +'mult' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1.0' Literal.Number +'/' Operator +'weightRange' Name +';' Operator +'\n\t\n\t\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +'weights' Name +')' Operator +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@WeightAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'weights' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'weight' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'weights' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1' Literal.Number +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'weights' Name +' ' Text.Whitespace +'*' Punctuation +' ' Text.Whitespace +'mult' Name +';' Operator +'\n\t ' Text.Whitespace +'ELSE' Keyword +'\n\t ' Text.Whitespace +'weights' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'@@likenessAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'"weight"' Literal.String +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'weights' Name +')' Operator +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1000' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'mult' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t\n\t' Text.Whitespace +'resultsLoc' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'SELECT' Keyword +' ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'FROM' Keyword +' ' Text.Whitespace +'members' Name +':' Operator +'member' Name +' ' Text.Whitespace +'-' Operator +'(' Operator +':' Operator +'e' Name +')' Operator +' -' Operator +' ' Text.Whitespace +'location' Name +':' Operator +' ' Text.Whitespace +'loc' Name +'\n\t ' Text.Whitespace +'ACCUM' Keyword +' \n\t ' Text.Whitespace +'@@LocAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'Check_Distance' Name +'(' Operator +'loc' Name +',' Operator +'memLoc' Name +')' Operator +')' Operator +';' Operator +'\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +'loc' Name +')' Operator +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@LocAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'5800' Literal.Number +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'ceil' Name +'(' Operator +'loc' Name +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'floor' Name +'(' Operator +'loc' Name +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t' Text.Whitespace +'PRINT' Keyword +' ' Text.Whitespace +'lastMax' Name +';' Operator +'\n\t' Text.Whitespace +'PRINT' Keyword +' ' Text.Whitespace +'lastMin' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'locRange' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'lastMin' Name +';' Operator +'\n\t' Text.Whitespace +'print' Keyword +' ' Text.Whitespace +'locRange' Name +';' Operator +'\n\t' Text.Whitespace +'mult' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1.0' Literal.Number +'/' Operator +'locRange' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +'loc' Name +')' Operator +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'@@LocAccum' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'IF' Keyword +' ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'5800' Literal.Number +' ' Text.Whitespace +'THEN' Keyword +'\n\t ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'-' Operator +'1' Literal.Number +';' Operator +'\n\t ' Text.Whitespace +'ELSE' Keyword +'\n\t ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1' Literal.Number +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'loc' Name +' ' Text.Whitespace +'*' Punctuation +' ' Text.Whitespace +'mult' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'@@likenessAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'"distance"' Literal.String +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'loc' Name +')' Operator +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t' Text.Whitespace +'lastMax' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'lastMin' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'1000' Literal.Number +';' Operator +'\n\t' Text.Whitespace +'mult' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t\n\t' Text.Whitespace +'incentives' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'{' Punctuation +'incentive' Name +'.' Punctuation +'*' Punctuation +'}' Punctuation +';' Operator +'\n\t\n\t' Text.Whitespace +'incentives' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'SELECT' Keyword +' ' Text.Whitespace +'incent' Name +' ' Text.Whitespace +'FROM' Keyword +' ' Text.Whitespace +'incentives' Name +':' Operator +'incent' Name +' ' Text.Whitespace +'- ' Operator +'(' Operator +':' Operator +'e' Name +')' Operator +' -' Operator +' ' Text.Whitespace +'lookupRule' Name +':' Operator +'rule' Name +' ' Text.Whitespace +'WHERE' Keyword +'\n\t ' Text.Whitespace +'rule' Name +'.' Punctuation +'RuleName' Name +' ' Text.Whitespace +'== ' Operator +'"Tenacity"' Literal.String +' ' Text.Whitespace +'AND' Keyword +' ' Text.Whitespace +'incent' Name +'.' Punctuation +'IncentiveDate' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'datetime_sub' Keyword +'(' Operator +'lastRecording' Name +',' Operator +' ' Text.Whitespace +'INTERVAL' Keyword +' ' Text.Whitespace +'1' Literal.Number +' ' Text.Whitespace +'MONTH' Name +')' Operator +' ' Text.Whitespace +'AND' Keyword +' ' Text.Whitespace +'incent' Name +'.' Punctuation +'IncentiveDate' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'lastRecording' Name +';' Operator +'\n\t\n\t' Text.Whitespace +'members' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'SELECT' Keyword +' ' Text.Whitespace +'member' Name +' ' Text.Whitespace +'FROM' Keyword +' ' Text.Whitespace +'incentives' Name +':' Operator +'incent' Name +' ' Text.Whitespace +'- ' Operator +'(' Operator +':' Operator +'e' Name +')' Operator +' -' Operator +' ' Text.Whitespace +'motionMember' Name +':' Operator +'member' Name +'\n\t ' Text.Whitespace +'ACCUM' Keyword +'\n\t ' Text.Whitespace +'@@DayIncentives' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'incent' Name +')' Operator +')' Operator +';' Operator +'\n\t\n\t' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'(' Operator +'member' Name +',' Operator +' ' Text.Whitespace +'incent' Name +')' Operator +' ' Text.Whitespace +'IN' Keyword +' ' Text.Whitespace +'@@DayIncentives' Name.Variable +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'@@StepsAccum' Name.Variable +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'0' Literal.Number +';' Operator +'\n\t ' Text.Whitespace +'FOREACH' Keyword +' ' Text.Whitespace +'Incentive' Name +' ' Text.Whitespace +'IN' Keyword +' ' Text.Whitespace +'incent' Name +' ' Text.Whitespace +'DO' Keyword +'\n\t ' Text.Whitespace +'@@StepsAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'Incentive' Name +'.' Punctuation +'TotalSteps' Name +';' Operator +'\n\t ' Text.Whitespace +'@@BoutsAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'Incentive' Name +'.' Punctuation +'TotalBouts' Name +';' Operator +'\n\t ' Text.Whitespace +'@@MilesAccum' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'Incentive' Name +'.' Punctuation +'Miles' Name +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t ' Text.Whitespace +'@@MemberStats' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'"stepsAvg"' Literal.String +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'@@StepsAccum' Name.Variable +')' Operator +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'@@MemberStats' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'"stepsSlope"' Literal.String +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'Linear_Regression' Name +'(' Operator +'incent' Name +',' Operator +' ' Text.Whitespace +'1' Literal.Number +')' Operator +')' Operator +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'# @@MemberStats += (member -> ("boutsAvg" -> @@BoutsAccum));\n' Comment.Single + +'\t # @@MemberStats += (member -> ("boutsSlope" -> Linear_Regression(incent, 2)));\n' Comment.Single + +'\t ' Text.Whitespace +'@@MemberStats' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'"milesAvg"' Literal.String +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'@@MilesAccum' Name.Variable +')' Operator +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'@@MemberStats' Name.Variable +' ' Text.Whitespace +'+= ' Operator +'(' Operator +'member' Name +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'(' Operator +'"milesSlope"' Literal.String +' ' Text.Whitespace +'->' Operator +' ' Text.Whitespace +'Linear_Regression' Name +'(' Operator +'incent' Name +',' Operator +' ' Text.Whitespace +'3' Literal.Number +')' Operator +')' Operator +')' Operator +';' Operator +'\n\t ' Text.Whitespace +'END' Keyword +';' Operator +'\n\t\n\t\n\t' Text.Whitespace +'PRINT' Keyword +' ' Text.Whitespace +'@@MemberStats' Name.Variable +';' Operator +'\n\t' Text.Whitespace +'PRINT' Keyword +' ' Text.Whitespace +'@@likenessAccum' Name.Variable +';' Operator +'\n\t\n' Text.Whitespace + +'}' Punctuation +'\n' Text.Whitespace