parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
Доклад (https://www.youtube.com/watch?v=kZto4nWVlmA) от 29 мая для Moscow Scala Group (http://www.meetup.com/Scala-Moscow/events/180007162/)
2. задача парсинга
вход: строка, поток байт, ...
выход: обладает структурой (да/нет), структура
пример
1+2*3—арифметическоевыражение:даилинет?—да
1+2*3—структура?—Plus(1,Mul(2,3))
6. рекурсивный нисходящий парсер
плюсы
1. код на одном языке
2. одна среда разработки
3. высокая производительность
минусы
1. нет предметно-ориентиррованного языка
2. низкоуровневое кодирование
7. внутренний язык и среда разработки
генерация java-файлов
подключение файлов к проекту
ANTLR3
grammarSimpleCalc;
add:NUMBERPLUSNUMBER;
NUMBER :('0'..'9')+;
PLUS :'+';
javaorg.antlr.ToolSimpleCalc.g
13. rule, ch, str
реализация класса `Parser`
правила грамматики внутри метода rule { }
classSampleParser(valinput:ParserInput)extendsParser{
defAbc=rule{"abc"}
defCh =rule{'7'}
defNum=rule{42}//ошибкакомпиляции
}
14. a ~ b, a | b
classSampleParser(valinput:ParserInput)extendsParser{
defr1=rule{"a"~"b"}//"ab"
defr2=rule{"a"|"b"}//{"a","b"}
defr3=rule{"a"~("b"|"c")}//{"ab","ac"}
defr4=rule{"ab"|"a"}
}
20. типизация правил и value-stack
defInputRule:Rule[HNil,String::HNil]=rule{capture("a")}
classRule[-I<:HList,+O<:HList]
I-типзначениясостека
O-типзначениявстек
typeRuleN[L<:HList]=Rule[HNil,L]
typeRule0=RuleN[HNil]
typeRule1[T]=RuleN[T::HNil]
typeRule2[A,B]=RuleN[A::B::HNil]
21. типизация правил и value-stack
defa: Rule1[String]=rule{capture("a")}
defb: Rule1[String]=rule{capture("7")}
defbi:Rule1[Int] =rule{b~>((_:String).toInt)}
22. типизация правил и value-stack
defc1:Rule2[String,Int]=rule{a~bi}
defc2:Rule2[Int,Int]=rule{bi~push(42)}
defc3:Rule[Int::HNil,Int::HNil]=rule{capture("7")~>((x:Int,y:String)=>x+y.toInt)}