public AntlrTokenAdapter(IToken token, Lexer lexer) { Token = token; Name = lexer.Vocabulary.GetSymbolicName(Token.Type); /// Разбиваем текст токена на части, расположенные на разных строках var partsOnSeparateLines = Token.Text.Split('\n'); /// Заканчивается ли последняя часть переходом на новую строке var endsWithEol = Token.Text.EndsWith("\n"); /// Если да, то в нашем разбиении последняя часть - это предпоследний элемент var lastPartLength = endsWithEol ? partsOnSeparateLines[partsOnSeparateLines.Length - 2].Length + 1 : partsOnSeparateLines[partsOnSeparateLines.Length - 1].Length; /// Количество переходов на новую строку, входящих в текст токена var eolCount = partsOnSeparateLines.Length - 1; Location = new SegmentLocation() { Start = new PointLocation(Token.Line, Token.Column, Token.StartIndex), End = new PointLocation( Token.Line + (endsWithEol ? eolCount - 1 : eolCount), eolCount == 0 || eolCount == 1 && endsWithEol ? Token.Column + lastPartLength - 1 : lastPartLength - 1, Token.StopIndex ) }; }
public ScanObj(int t, ValueType val, Land.Core.SegmentLocation loc) { this.token = t; this.yylval = val; this.yylloc = loc; }