Как я и думал, проблему можно решить, расширив поведение Lexer, а не Parser. Стандартный лексер принимает только десятичные цифры, поэтому я создал новый лексер:
class MyLexer extends StdLexical {
override type Elem = Char
override def digit = ( super.digit | hexDigit )
lazy val hexDigits = Set[Char]() ++ "0123456789abcdefABCDEF".toArray
lazy val hexDigit = elem("hex digit", hexDigits.contains(_))
}
И мой парсер (который должен быть StandardTokenParser) может быть расширен следующим образом:
object ParseAST extends StandardTokenParsers{
override val lexical:MyLexer = new MyLexer()
lexical.delimiters += ( "(" , ")" , "," , "@")
...
}
Построение «числа» из цифр обеспечивается классом StdLexical:
class StdLexical {
...
def token: Parser[Token] =
...
| digit~rep(digit)^^{case first ~ rest => NumericLit(first :: rest mkString "")}
}
Поскольку StdLexical выдает только проанализированный номер в виде строки, для меня это не проблема, так как меня не интересует также числовое значение.