Я новичок в лексировании и синтаксическом анализе в целом, за исключением небольших случаев. С учетом этого предостережения моя проблема в том, что я пытаюсь разобрать JSP-подобный диалект в Scala. Я обрабатываю поток символов, и когда дохожу до тега типа JSP, я застреваю.
Some text<%tag attribute="value"%>more stuff.
Мой лексер прямо сейчас пытается вытащить часть тега и токенизировать, поэтому у меня есть что-то вроде:
def document: Parser[Token] = tag | regular
def tag: Parser[Token] = elem('<') ~ elem('%') ~ rep1(validTagName) ~ tagAttribute.* ~ elem('%') ~ elem('>') ^^ {
case a ~ b ~ tagName ~ tagAttributes ~ c ~ d => {
Tag(tagName.foldLeft("")(_+_)) :: tagAttributes.flatMap(_)
}
}
def validTagName: Parser[Token] = elem("",Character.isLetter(_)) // over-simplified
... Other code for tagAttribute and Tag extends Token here
Вы, вероятно, можете обнаружить около полдюжины проблем прямо сейчас, я знаю, что могу определить несколько самостоятельно, но это то место, где я сейчас нахожусь. В конечном итоге функция токена должна возвращать синтаксический анализатор, и, если я все правильно понимаю, синтаксический анализатор может состоять из других синтаксических анализаторов. Я считаю, что я смогу создать синтаксический анализатор, объединив несколько других Parser[Token]
объектов. Я не знаю, как это сделать, и не совсем понимаю, лучший ли это способ сделать это.