Problem
RegexParsers를 상속하는 Parsers 클래스 내부에서 Parser[_]로 선언된 모든 production rule은 자동으로 whitespace를 "무시"합니다.
참고: StackOverflow 질문
따라서 python spec - 2. lexical analysis에 나온대로 sub-production을 모두 Parser로 선언해버릴 경우, 사이에 공백을 두고 서로 다른 토큰으로 인식되어야 하는 문자열이 공백을 무시하고 하나의 토큰으로 인식됩니다.
예시)
// Tokenizer.scala
...
lazy val digitPart: Parser[String] = ... // 숫자를 매칭
lazy val exponent: Parser[String] = ... // "e" ~ 숫자를 매칭
lazy val exponentFloat: Parser[String] = (pointloat | digitPart) ~ exponent ^^ ... // 3e10과 같은 과학적 표기법을 매칭
이 경우 3e 10 이라는 문자열이 NUM(3), NAME(e), NUM(10)으로 각각 토큰화되어야하지만, 위 구현에서는 NUM(3e10)으로 하나의 토큰으로 토큰화됨.
Solution
위의 예시와 같이 sub-production rule을 Parser로 선언하는 것이 아닌, 해당 룰의 regex 만을 적어놓고 floatNumber와 같은 top-level 만 Parser로 선언해야 함
Fix
Problem
RegexParsers를 상속하는 Parsers 클래스 내부에서 Parser[_]로 선언된 모든 production rule은 자동으로 whitespace를 "무시"합니다.
참고: StackOverflow 질문
따라서 python spec - 2. lexical analysis에 나온대로 sub-production을 모두 Parser로 선언해버릴 경우, 사이에 공백을 두고 서로 다른 토큰으로 인식되어야 하는 문자열이 공백을 무시하고 하나의 토큰으로 인식됩니다.
예시)
이 경우
3e 10이라는 문자열이NUM(3), NAME(e), NUM(10)으로 각각 토큰화되어야하지만, 위 구현에서는NUM(3e10)으로 하나의 토큰으로 토큰화됨.Solution
위의 예시와 같이 sub-production rule을 Parser로 선언하는 것이 아닌, 해당 룰의 regex 만을 적어놓고 floatNumber와 같은 top-level 만 Parser로 선언해야 함
Fix
"(" ~ sth ~ ")"to make new regex