2015-06-13 3 views
1

Я пишу SCALA анализатор для разбора следующего входа (х номер): /hdfs://xxx.xx.xx.x:xxxx/path1/file1.jpg+1Как исправить ошибку в синтаксическом анализе, используя scala parser?

trait pathIdentifier extends RegexParsers{ 
    def pathIdent: Parser[String] ="""^/hdfs://([\d\.]+):(\d+)/([\w/]+/(\w+\.\w+)$)""".r 
    } 


class ParseExp extends JavaTokenParsers with pathIdentifier { 
def expr: Parser[Any] = term~rep("+"~term | "-"~term) 
def term: Parser[Any] = factor~rep("*"~factor | "/"~factor) 
def factor: Parser[Any] = pathIdent | floatingPointNumber | "("~expr~")" 
} 

I я получаю следующую ошибку:

[1.1] failure: `(' expected but `/' found 

Невозможно решить проблему!

ответ

2

Здесь есть две проблемы. Сначала вы пытаетесь сопоставить строку, начинающуюся с /hfds, но ваш ввод начинается с /hdfs. Во-вторых, регулярное выражение, которое у вас есть, будет пытаться совместить все входные данные с привязанными вами знаками (^ и $). Это означает, что при использовании синтаксического анализатора pathIdent он попытается совместить все входные данные, пока Reader не будет возвращать больше значений.

В вашем входе есть +1 после .jpg и \w не соответствует +, поэтому вы получите отказ синтаксического анализа. Поэтому вы должны удалить их.

Запуска экспрессии с expr парсером, я получаю:

[1.43] parsed: ((/hdfs://111.22.33.4:5555/path1/file1.jpg~List())~List((+~(1~List())))) 

, который действительно является фактор следует пустому повторение факторов (/hdfs://111.22.33.4:5555/path1/file1.jpg~List())) с последующим повторением термина с +, что является (1), а затем пустым повторением факторов (List((+~(1~List())))).

+0

@Rubbic Parsing '(/hdfs://111.22.33.4:5555/path1/file1.jpg+1)' работает для меня. –

+0

Я получаю эту ошибку: -bash: синтаксическая ошибка около неожиданного токена '/hdfs://111.33.50.2:8020/path1/path2/file1.jpg+1 ', где я не получаю его без скобок – Rubbic

+0

' (/ hdfs: //111.22.33.4: 5555/path1/file1.jpg + 1) 'является' expr' в скобках (третий вариант парсера 'factor'). Каков точный ввод, который вы пытаетесь проанализировать? –

Смежные вопросы