symbol-map.go: improved detection of incomplete operations
This commit is contained in:
parent
01c04feea5
commit
d25bd325b7
184
symbol-map.go
184
symbol-map.go
@ -14,7 +14,7 @@ type symbolClass int16
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
symClassOperator symbolClass = iota
|
symClassOperator symbolClass = iota
|
||||||
symClassPostOp
|
symClassCommand
|
||||||
symClassIdentifier
|
symClassIdentifier
|
||||||
symClassDelimiter
|
symClassDelimiter
|
||||||
symClassParenthesis
|
symClassParenthesis
|
||||||
@ -24,83 +24,84 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type symbolSpec struct {
|
type symbolSpec struct {
|
||||||
repr string
|
repr string
|
||||||
kind symbolClass
|
kind symbolClass
|
||||||
|
opType termPosition
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
||||||
symbolMap = map[Symbol]symbolSpec{
|
symbolMap = map[Symbol]symbolSpec{
|
||||||
SymUnknown: {"<unknown>", symClassOther}, // -1: Unknown symbol
|
SymUnknown: {"<unknown>", symClassOther, posLeaf}, // -1: Unknown symbol
|
||||||
SymNone: {"<null>", symClassOther}, // 0: Null value for variable of type symbol
|
SymNone: {"<null>", symClassOther, posLeaf}, // 0: Null value for variable of type symbol
|
||||||
SymError: {"<error>", symClassOther}, // 1: Error reading from stream
|
SymError: {"<error>", symClassOther, posLeaf}, // 1: Error reading from stream
|
||||||
SymEos: {"<eos>", symClassOther}, // 2: End of stream
|
SymEos: {"<eos>", symClassOther, posLeaf}, // 2: End of stream
|
||||||
SymMinus: {"-", symClassOperator}, // 3: '-'
|
SymMinus: {"-", symClassOperator, posInfix}, // 3: '-'
|
||||||
SymMinusEqual: {"-=", symClassOperator}, // 4: '-='
|
SymMinusEqual: {"-=", symClassOperator, posInfix}, // 4: '-='
|
||||||
SymDoubleMinus: {"--", symClassOperator}, // 5: '--'
|
SymDoubleMinus: {"--", symClassOperator, posPostfix}, // 5: '--'
|
||||||
SymPlus: {"+", symClassOperator}, // 6: '+'
|
SymPlus: {"+", symClassOperator, posInfix}, // 6: '+'
|
||||||
SymPlusEqual: {"+=", symClassOperator}, // 7: '+='
|
SymPlusEqual: {"+=", symClassOperator, posInfix}, // 7: '+='
|
||||||
SymDoublePlus: {"++", symClassOperator}, // 8: '++'
|
SymDoublePlus: {"++", symClassOperator, posPostfix}, // 8: '++'
|
||||||
SymStar: {"*", symClassOperator}, // 9: '*'
|
SymStar: {"*", symClassOperator, posInfix}, // 9: '*'
|
||||||
SymDoubleStar: {"**", symClassOperator}, // 10: '**'
|
SymDoubleStar: {"**", symClassOperator, posInfix}, // 10: '**'
|
||||||
SymSlash: {"/", symClassOperator}, // 11: '/'
|
SymSlash: {"/", symClassOperator, posInfix}, // 11: '/'
|
||||||
SymBackSlash: {"\\", symClassOperator}, // 12: '\'
|
SymBackSlash: {"\\", symClassOperator, posLeaf}, // 12: '\'
|
||||||
SymVertBar: {"|", symClassOperator}, // 13: '|'
|
SymVertBar: {"|", symClassOperator, posInfix}, // 13: '|'
|
||||||
SymDoubleVertBar: {"||", symClassOperator}, // 14: '||'
|
SymDoubleVertBar: {"||", symClassOperator, posInfix}, // 14: '||'
|
||||||
SymComma: {",", symClassOperator}, // 15: ','
|
SymComma: {",", symClassOperator, posInfix}, // 15: ','
|
||||||
SymColon: {":", symClassOperator}, // 16: ':'
|
SymColon: {":", symClassOperator, posInfix}, // 16: ':'
|
||||||
SymSemiColon: {";", symClassOperator}, // 17: ';'
|
SymSemiColon: {";", symClassOperator, posInfix}, // 17: ';'
|
||||||
SymDot: {".", symClassOperator}, // 18: '.'
|
SymDot: {".", symClassOperator, posInfix}, // 18: '.'
|
||||||
SymDotSlash: {"./", symClassOperator}, // 19: './'
|
SymDotSlash: {"./", symClassOperator, posInfix}, // 19: './'
|
||||||
SymQuote: {"'", symClassDelimiter}, // 20: '\''
|
SymQuote: {"'", symClassDelimiter, posLeaf}, // 20: '\''
|
||||||
SymDoubleQuote: {"\"", symClassDelimiter}, // 21: '"'
|
SymDoubleQuote: {"\"", symClassDelimiter, posLeaf}, // 21: '"'
|
||||||
SymBackTick: {"`", symClassOperator}, // 22: '`'
|
SymBackTick: {"`", symClassDelimiter, posLeaf}, // 22: '`'
|
||||||
SymExclamation: {"!", symClassPostOp}, // 23: '!'
|
SymExclamation: {"!", symClassOperator, posPostfix}, // 23: '!'
|
||||||
SymQuestion: {"?", symClassOperator}, // 24: '?'
|
SymQuestion: {"?", symClassOperator, posInfix}, // 24: '?'
|
||||||
SymAmpersand: {"&", symClassOperator}, // 25: '&'
|
SymAmpersand: {"&", symClassOperator, posInfix}, // 25: '&'
|
||||||
SymDoubleAmpersand: {"&&", symClassOperator}, // 26: '&&'
|
SymDoubleAmpersand: {"&&", symClassOperator, posInfix}, // 26: '&&'
|
||||||
SymPercent: {"%", symClassOperator}, // 27: '%'
|
SymPercent: {"%", symClassOperator, posInfix}, // 27: '%'
|
||||||
SymAt: {"@", symClassOperator}, // 28: '@'
|
SymAt: {"@", symClassOperator, posPrefix}, // 28: '@'
|
||||||
SymUndescore: {"_", symClassOperator}, // 29: '_'
|
SymUndescore: {"_", symClassIdentifier, posLeaf}, // 29: '_'
|
||||||
SymEqual: {"=", symClassOperator}, // 30: '='
|
SymEqual: {"=", symClassOperator, posInfix}, // 30: '='
|
||||||
SymDoubleEqual: {"==", symClassOperator}, // 31: '=='
|
SymDoubleEqual: {"==", symClassOperator, posInfix}, // 31: '=='
|
||||||
SymLess: {"<", symClassOperator}, // 32: '<'
|
SymLess: {"<", symClassOperator, posInfix}, // 32: '<'
|
||||||
SymLessOrEqual: {"<=", symClassOperator}, // 33: '<='
|
SymLessOrEqual: {"<=", symClassOperator, posInfix}, // 33: '<='
|
||||||
SymGreater: {">", symClassOperator}, // 34: '>'
|
SymGreater: {">", symClassOperator, posInfix}, // 34: '>'
|
||||||
SymGreaterOrEqual: {">=", symClassOperator}, // 35: '>='
|
SymGreaterOrEqual: {">=", symClassOperator, posInfix}, // 35: '>='
|
||||||
SymLessGreater: {"<>", symClassOperator}, // 36: '<>'
|
SymLessGreater: {"<>", symClassOperator, posInfix}, // 36: '<>'
|
||||||
SymNotEqual: {"!=", symClassOperator}, // 37: '!='
|
SymNotEqual: {"!=", symClassOperator, posInfix}, // 37: '!='
|
||||||
SymDollar: {"$", symClassOperator}, // 38: '$'
|
SymDollar: {"$", symClassOperator, posPrefix}, // 38: '$'
|
||||||
SymHash: {"#", symClassOperator}, // 39: '#'
|
SymHash: {"#", symClassOperator, posPrefix}, // 39: '#'
|
||||||
SymOpenRound: {"(", symClassParenthesis}, // 40: '('
|
SymOpenRound: {"(", symClassParenthesis, posPrefix}, // 40: '('
|
||||||
SymClosedRound: {")", symClassParenthesis}, // 41: ')'
|
SymClosedRound: {")", symClassParenthesis, posPostfix}, // 41: ')'
|
||||||
SymOpenSquare: {"[", symClassParenthesis}, // 42: '['
|
SymOpenSquare: {"[", symClassParenthesis, posPrefix}, // 42: '['
|
||||||
SymClosedSquare: {"]", symClassParenthesis}, // 43: ']'
|
SymClosedSquare: {"]", symClassParenthesis, posPostfix}, // 43: ']'
|
||||||
SymOpenBrace: {"{", symClassParenthesis}, // 44: '{'
|
SymOpenBrace: {"{", symClassParenthesis, posPrefix}, // 44: '{'
|
||||||
SymClosedBrace: {"}", symClassParenthesis}, // 45: '}'
|
SymClosedBrace: {"}", symClassParenthesis, posPostfix}, // 45: '}'
|
||||||
SymTilde: {"~", symClassOperator}, // 46: '~'
|
SymTilde: {"~", symClassOperator, posPrefix}, // 46: '~'
|
||||||
SymDoubleQuestion: {"??", symClassOperator}, // 47: '??'
|
SymDoubleQuestion: {"??", symClassOperator, posInfix}, // 47: '??'
|
||||||
SymQuestionEqual: {"?=", symClassOperator}, // 48: '?='
|
SymQuestionEqual: {"?=", symClassOperator, posInfix}, // 48: '?='
|
||||||
SymQuestionExclam: {"?!", symClassOperator}, // 49: '?!'
|
SymQuestionExclam: {"?!", symClassOperator, posInfix}, // 49: '?!'
|
||||||
SymDoubleAt: {"@@", symClassOperator}, // 50: '@@'
|
SymDoubleAt: {"@@", symClassCommand, posLeaf}, // 50: '@@'
|
||||||
SymDoubleColon: {"::", symClassOperator}, // 51: '::'
|
SymDoubleColon: {"::", symClassOperator, posInfix}, // 51: '::'
|
||||||
SymDoubleGreater: {">>", symClassOperator}, // 52: '>>'
|
SymDoubleGreater: {">>", symClassOperator, posInfix}, // 52: '>>'
|
||||||
SymDoubleLess: {"<<", symClassOperator}, // 53: '<<'
|
SymDoubleLess: {"<<", symClassOperator, posInfix}, // 53: '<<'
|
||||||
SymCaret: {"^", symClassOperator}, // 54: '^'
|
SymCaret: {"^", symClassOperator, posInfix}, // 54: '^'
|
||||||
SymDollarRound: {"$(", symClassOperator}, // 55: '$('
|
SymDollarRound: {"$(", symClassOperator, posPrefix}, // 55: '$('
|
||||||
SymOpenClosedRound: {"()", symClassPostOp}, // 56: '()'
|
SymOpenClosedRound: {"()", symClassOperator, posPostfix}, // 56: '()'
|
||||||
SymDoubleDollar: {"$$", symClassOperator}, // 57: '$$'
|
SymDoubleDollar: {"$$", symClassCommand, posLeaf}, // 57: '$$'
|
||||||
SymDoubleDot: {"..", symClassOperator}, // 58: '..'
|
SymDoubleDot: {"..", symClassOperator, posInfix}, // 58: '..'
|
||||||
SymTripleDot: {"...", symClassOperator}, // 59: '...'
|
SymTripleDot: {"...", symClassOperator, posPostfix}, // 59: '...'
|
||||||
SymStarEqual: {"*=", symClassOperator}, // 60: '*='
|
SymStarEqual: {"*=", symClassOperator, posInfix}, // 60: '*='
|
||||||
SymSlashEqual: {"/=", symClassOperator}, // 61: '/='
|
SymSlashEqual: {"/=", symClassOperator, posInfix}, // 61: '/='
|
||||||
SymPercEqual: {"%=", symClassOperator}, // 62: '%='
|
SymPercEqual: {"%=", symClassOperator, posInfix}, // 62: '%='
|
||||||
SymDoubleLessEqual: {"<<=", symClassOperator}, // 63: '<<='
|
SymDoubleLessEqual: {"<<=", symClassOperator, posInfix}, // 63: '<<='
|
||||||
SymDoubleGreaterEqual: {">>=", symClassOperator}, // 64: '>>='
|
SymDoubleGreaterEqual: {">>=", symClassOperator, posInfix}, // 64: '>>='
|
||||||
SymAmpersandEqual: {"&=", symClassOperator}, // 65: '&='
|
SymAmpersandEqual: {"&=", symClassOperator, posInfix}, // 65: '&='
|
||||||
SymVertBarEqual: {"|=", symClassOperator}, // 65: '|='
|
SymVertBarEqual: {"|=", symClassOperator, posInfix}, // 65: '|='
|
||||||
SymPlusGreater: {"+>", symClassOperator}, // 66: '+>'
|
SymPlusGreater: {"+>", symClassOperator, posInfix}, // 66: '+>'
|
||||||
SymLessPlus: {"<+", symClassOperator}, // 67: '<+'
|
SymLessPlus: {"<+", symClassOperator, posInfix}, // 67: '<+'
|
||||||
// SymChangeSign
|
// SymChangeSign
|
||||||
// SymUnchangeSign
|
// SymUnchangeSign
|
||||||
// SymIdentifier
|
// SymIdentifier
|
||||||
@ -127,17 +128,17 @@ func init() {
|
|||||||
// // SymClosedComment // 0: '*/'
|
// // SymClosedComment // 0: '*/'
|
||||||
// // SymOneLineComment // 0: '//'
|
// // SymOneLineComment // 0: '//'
|
||||||
// keywordBase
|
// keywordBase
|
||||||
SymKwAnd: {"and", symClassOperator},
|
SymKwAnd: {"and", symClassOperator, posInfix},
|
||||||
SymKwNot: {"not", symClassOperator},
|
SymKwNot: {"not", symClassOperator, posInfix},
|
||||||
SymKwOr: {"or", symClassOperator},
|
SymKwOr: {"or", symClassOperator, posInfix},
|
||||||
SymKwBut: {"but", symClassOperator},
|
SymKwBut: {"but", symClassOperator, posInfix},
|
||||||
SymKwFunc: {"func(", symClassDeclaration},
|
SymKwFunc: {"func(", symClassDeclaration, posPrefix},
|
||||||
SymKwBuiltin: {"builtin", symClassOperator},
|
SymKwBuiltin: {"builtin", symClassOperator, posPrefix},
|
||||||
SymKwPlugin: {"plugin", symClassOperator},
|
SymKwPlugin: {"plugin", symClassOperator, posPrefix},
|
||||||
SymKwIn: {"in", symClassOperator},
|
SymKwIn: {"in", symClassOperator, posInfix},
|
||||||
SymKwInclude: {"include", symClassOperator},
|
SymKwInclude: {"include", symClassOperator, posPrefix},
|
||||||
SymKwNil: {"nil", symClassValue},
|
SymKwNil: {"nil", symClassValue, posLeaf},
|
||||||
SymKwUnset: {"unset", symClassOperator},
|
SymKwUnset: {"unset", symClassOperator, posPrefix},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,12 +176,19 @@ func StringEndsWithOperator(s string) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func endingOperator(s string) (sym Symbol) {
|
func endingOperator(s string) (sym Symbol) {
|
||||||
|
var matchLength = 0
|
||||||
sym = SymNone
|
sym = SymNone
|
||||||
lower := strings.ToLower(s)
|
lower := strings.TrimRight(strings.ToLower(s), " \t")
|
||||||
for symbol, spec := range symbolMap {
|
for symbol, spec := range symbolMap {
|
||||||
if spec.kind == symClassOperator && strings.HasSuffix(lower, spec.repr) {
|
if strings.HasSuffix(lower, spec.repr) {
|
||||||
sym = symbol
|
if len(spec.repr) > matchLength {
|
||||||
break
|
matchLength = len(spec.repr)
|
||||||
|
if spec.kind == symClassOperator && (spec.opType == posInfix || spec.opType == posPrefix) {
|
||||||
|
sym = symbol
|
||||||
|
} else {
|
||||||
|
sym = SymNone
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user