diff --git a/include/PEGKit/PKToken.h b/include/PEGKit/PKToken.h index d6e0fd9..4617b4c 100644 --- a/include/PEGKit/PKToken.h +++ b/include/PEGKit/PKToken.h @@ -216,6 +216,12 @@ typedef NS_ENUM(NSInteger, PKTokenType) { */ @property (nonatomic, readonly) NSUInteger lineNumber; +/*! + @property column + @brief The zero-based position within the line of the start of this token in the original source string. + */ +@property (nonatomic, readonly) NSUInteger column; + /*! @property tokenKind @brief The kind of this token. diff --git a/include/PEGKit/PKTokenizer.h b/include/PEGKit/PKTokenizer.h index 26e343e..42b6218 100644 --- a/include/PEGKit/PKTokenizer.h +++ b/include/PEGKit/PKTokenizer.h @@ -175,5 +175,13 @@ #endif @property (nonatomic, readonly) NSUInteger lineNumber; + +/*! + @property lineStartOffset + @brief The offset within the original string where the current line started. + @details This is set by PKWhitespaceState and used to compute PKToken.column. + */ +@property (nonatomic, readonly) NSUInteger lineStartOffset; + @property (nonatomic, assign) id delegate; @end diff --git a/src/PKToken.m b/src/PKToken.m index 24f19d1..edb7060 100644 --- a/src/PKToken.m +++ b/src/PKToken.m @@ -82,6 +82,7 @@ - (BOOL)isEqual:(id)obj ignoringCase:(BOOL)ignoringCase; @property (nonatomic, readwrite) NSUInteger offset; @property (nonatomic, readwrite) NSUInteger lineNumber; +@property (nonatomic, readwrite) NSUInteger column; @end @implementation PKToken @@ -106,6 +107,7 @@ - (instancetype)initWithTokenType:(PKTokenType)t stringValue:(NSString *)s doubl self.doubleValue = n; self.offset = NSNotFound; self.lineNumber = NSNotFound; + self.column = NSNotFound; self.isNumber = (PKTokenTypeNumber == t); self.isQuotedString = (PKTokenTypeQuotedString == t); diff --git a/src/PKTokenizer.m b/src/PKTokenizer.m index 1d1cafd..6aab954 100644 --- a/src/PKTokenizer.m +++ b/src/PKTokenizer.m @@ -26,6 +26,7 @@ @interface PKToken () @property (nonatomic, readwrite) NSUInteger lineNumber; +@property (nonatomic, readwrite) NSUInteger column; @end @interface PKTokenizerState () @@ -40,6 +41,7 @@ - (NSInteger)tokenKindForStringValue:(NSString *)str; @property (nonatomic, retain) PKReader *reader; @property (nonatomic, retain) NSMutableArray *tokenizerStates; @property (nonatomic, readwrite) NSUInteger lineNumber; +@property (nonatomic, readwrite) NSUInteger lineStartOffset; @end @implementation PKTokenizer @@ -182,6 +184,7 @@ - (PKToken *)nextToken { if (state) { result = [state nextTokenFromReader:_reader startingWith:c tokenizer:self]; result.lineNumber = _lineNumber; + result.column = result.offset - _lineStartOffset; } else { result = [PKToken EOFToken]; } @@ -261,6 +264,7 @@ - (void)setString:(NSString *)s { } _reader.string = _string; self.lineNumber = 1; + self.lineStartOffset = 0; } @@ -271,6 +275,7 @@ - (void)setStream:(NSInputStream *)s { } _reader.stream = _stream; self.lineNumber = 1; + self.lineStartOffset = 0; } diff --git a/src/PKWhitespaceState.m b/src/PKWhitespaceState.m index 63e91c1..4324d8c 100644 --- a/src/PKWhitespaceState.m +++ b/src/PKWhitespaceState.m @@ -35,6 +35,7 @@ @interface PKToken () @interface PKTokenizer () @property (nonatomic, readwrite) NSUInteger lineNumber; +@property (nonatomic, readwrite) NSUInteger lineStartOffset; @end @interface PKTokenizerState () @@ -102,6 +103,7 @@ - (PKToken *)nextTokenFromReader:(PKReader *)r startingWith:(PKUniChar)cin token while ([self isWhitespaceChar:c]) { if ('\n' == c) { t.lineNumber++; + t.lineStartOffset = r.offset; } if (_reportsWhitespaceTokens) { [self append:c];