20130530-PEGjs

zuqqhi 2
zuqqhi 2楽天
PEG.js
- Javascript Parser Generator -
Hidetomo Suzuki
2013 / 5 / 30
Scope
Page 2
This MTG Target
Understand What’s PEG.js
Know How to Use PEG.js
Make New DSL and Parser
2013 / 5 / 30
Agenda
Page 3
Table of Contents
1.How to make parser
2. What’s PEG.js
3. Try to used to be PEG
4. Let’s make DSL
5.Applications
2013 / 5 / 30
Agenda
Page 4
Table of Contents
1.How to make parser
2. What’s PEG.js
3. Try to used to be PEG
4. Let’s make DSL
5.Applications
2013 / 5 / 30 Page 5
1. How to make parser
1. Lexical Analysis(字句解析)
2. Syntactic Parsing(構文解析)
3. Semantic Analysis(意味解析)
4. Intermidiate Code Generation(中間コード生成)
5. Code Optimization(コード最適化)
6. Code Generation(コード生成)
General Step of Processing with Compiler
Parser
2013 / 5 / 30 Page 6
1. How to make parser
1. Lexical Analysis(字句解析)
2. Syntactic Parsing(構文解析)
3. Semantic Analysis(意味解析)
Analysis for Make Parser
Make strings(minimum unit of string has semantic) from characters
Make tree structure from strings which result of Lexical Analysis
Type Check
※ A string of Lexical Analysis is called “Token”.
2013 / 5 / 30 Page 7
1. How to make parser
1. Lexical Analysis
position_x = position_x + 2.0 * time
 Identifier : position_x
 Substitution Symbol : =
 Identifier : position_x
 Addition Symbol : +
 Number : 2.0
 Multiple Symbol : *
 Identifier : time
2013 / 5 / 30 Page 8
1. How to make parser
2. Syntactic Parsing
 Identifier : position_x Substitution Symbol : =
 Identifier : position_x Addition Symbol : +
 Number : 2.0 Multiple Symbol : *
 Identifier : time
Substitution Symbol
Identifier
position_x
Expression
ExpressionExpression
Expression Expression
Identifier
position_x
Number
2.0
Identifier
time
=
+
*
2013 / 5 / 30 Page 9
1. How to make parser
3. Semantic Analysis
Substitution Symbol
Identifier
position_x
Expression
ExpressionExpression
Expression Expression
Identifier
position_x
Number Identifier
=
+
 Correct Case : Real Number * Integer Number
 Wrong Case : Real Number * Function Pointer
2.0 time
*
2013 / 5 / 30
Agenda
Page 10
Table of Contents
1.How to make parser
2. What’s PEG.js
3. Try to used to be PEG
4. Let’s make DSL
5.Applications
2013 / 5 / 30 Here comes
your footer 
2. What‘s PEG.js?
 Parser Generator for JavaScript
 Use PEG
(Parsing Expression Grammar)
 Easy to try with the web page
Outline of PEG.js
http://pegjs.majda.cz/
2013 / 5 / 30 Here comes
your footer 
2. What‘s PEG.js?
PEG(Parsing Expression Grammar) is one of grammar for artificial language.
Focus point is how input will be analyzed.
What‘s PEG
Ex) Simple Expression Grammar which Has Four Arithmetic Operations
expression <- addexp
addexp <- multiexp (“+” multiexp / “-” multiexp)*
multiexp <- number (“*” number / “/” number)*
number <- [0-9]+
Accept : 2*3+6/2-5*3 -> multiexp + multiexp – multiexp -> ・・・
Decline : (1+1)*3+6/2-(7-2)*3 -> ?*3+6/2-?*3 -> can’t recognize…
2013 / 5 / 30 Here comes
your footer 
2. What‘s PEG.js?
• Nothing Confusion
• Different : “a b / a”, “a / a b”
• Easy to use compared with CFG
• Don’t need to implement
scanner (Lexical Analyzer)
• Don’t Express Left Recursive
PEG vs CFG(Context Free Grammar)
• Confusion Existing
• Same : “a b | a”, “a | a b”
• Need to implement scanner
• Can Express Left Recursive
PEG CFG
2013 / 5 / 30 Page 14
2. What‘s PEG.js?
1. Make Grammar with PEG
2. Generate Parser with “pegjs” Command
3. Use the Parser Loaded as a Library
Step of Make Parser with PEG.js
vim filename.pegjs
Pegjs filename.pegjs parser.js
<script src=“./parser.js” type=“text/javascript”></script>
<script type=“text/javascript”>
parser.parse(“something”);
2013 / 5 / 30 Page 15
2. What‘s PEG.js?
Install PEG.js
# Install Pythonbrew
$ curl -kL http://xrl.us/pythonbrewinstall | bash
$ vim ~/.bash_profile
[[ -s $HOME/.pythonbrew/etc/bashrc ]] && source $HOME/.pythonbrew/etc/bashrc
$ source ~/.bashrc
$ pythonbrew install 2.7.2
$ pythonbrew switch 2.7.2
# Install Node
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ nvm install v0.8.7
$ source ~/.nvm/nvm.sh
$ nvm use v0.8.7
$ vim ~/.npmrc
$ registry = http://registry.npmjs.org/
2013 / 5 / 30 Page 16
2. What‘s PEG.js?
1. Make Grammar with PEG
2. Generate Parser with “pegjs” Command
3. Use the Parser Loaded as a Library
Let’s use PEG.js a little bit
$ vim ffirst.pegjs
start = addexp
addexp = integer ("+" integer / "-" integer)*
integer = [0-9]+
$ ./node_modules/pegjs/bin/pegjs first.pegjs parser.js
$ vim parser.js
1st line: module.export = … -> var parser = …
$ vim index.html
<script type=“text/javascript” src=“./parser.js”></script>
<script type=“text/javascript”>
alert(parser.parse(“1+2+3-5”));
</script>
2013 / 5 / 30
Agenda
Page 17
Table of Contents
1.How to make parser
2. What’s PEG.js
3. Try to used to be PEG
4. Let’s make DSL
5.Applications
2013 / 5 / 30 Page 18
3.Try to used to be PEG
PEG.js Online Version (http://pegjs.majda.cz/online)
2013 / 5 / 30 Page 19
3. Try to used to be PEG
Very Simple PEG.js Grammar(calc : integer)
Grammar
Test Input
Test Input Result
start = integer
integer = digits:[0-9]+ { return parseInt(digits.join(“”), 10); }
123456789
123456789
2013 / 5 / 30 Page 20
3. Try to used to be PEG
Very Simple PEG.js Grammar(calc : add two integer)
Grammar
Test Input
Test Input Result
start = target1:integer "+" target2:integer { return target1+target2; }
integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); }
81+19
100
2013 / 5 / 30 Page 21
3. Try to used to be PEG
Very Simple PEG.js Grammar(calc : add and minus two integer)
Grammar
Test Input
Test Input Result
start
= target1:integer "+" target2:integer { return target1+target2; }
/ target1:integer "-" target2:integer { return target1-target2; }
integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); }
100-19
81
2013 / 5 / 30 Page 22
3. Try to used to be PEG
Very Simple PEG.js Grammar(calc : add and minus integers)
Grammar
Test Input
Test Input Result
start = expression
expression
= ope1:integer "+" ope2:expression { return ope1+ope2; }
/ ope1:integer "-" ope2:expression { return ope1-ope2; }
/ ope:integer { return ope; }
integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); }
1+2+3+4+5-6+7-8+9-10
9
2013 / 5 / 30 Page 23
3. Try to used to be PEG
Very Simple PEG.js Grammar(calc : four arithmetic)
Grammar
Test Input
Test Input Result
start = expression
expression
= ope1:integer "+" ope2:expression { return ope1+ope2; }
/ ope1:integer "-" ope2:expression { return ope1-ope2; }
/ ope1:integer "*" ope2:expression { return ope1*ope2; }
/ ope1:integer "/" ope2:expression { return ope1/ope2; }
/ ope:integer { return ope; }
integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); }
2*3/2
3
2013 / 5 / 30 Page 24
3. Try to used to be PEG
Very Simple PEG.js Grammar(calc : four arithmetic with priority)
Grammar
Test Input
Test Input Result
start = expression
expression = ope1:multiple "+" ope2:expression { return ope1+ope2; }
/ ope1:multiple "-" ope2:expression { return ope1-ope2; }
/ ope:multiple { return ope; }
multiple = ope1:integer "*" ope2:multiple { return ope1*ope2; }
/ ope1:integer "/" ope2:multiple { return ope1/ope2; }
/ ope:integer { return ope; }
integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); }
2*3/2+8/4
5
2013 / 5 / 30 Page 25
3. Try to used to be PEG
Very Simple PEG.js Grammar(calc : four arithmetic with priority)
Grammar
Test Input
Test Input Result
start = expression
expression = ope1:multiple "+" ope2:expression { return ope1+ope2; }
/ ope1:multiple "-" ope2:expression { return ope1-ope2; }
/ ope:multiple { return ope; }
multiple = ope1:bracket "*" ope2:multiple { return ope1*ope2; }
/ ope1:bracket "/" ope2:multiple { return ope1/ope2; }
/ ope:bracket { return ope; }
bracket = "(" exp:expression ")" {return exp; }
/ ope:integer {return ope; }
integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); }
(7+3)*3/2+8/(6-2)
17
2013 / 5 / 30
Agenda
Page 26
Table of Contents
1.How to make parser
2. What’s PEG.js
3. Try to used to be PEG
4. Let’s make DSL
5.Applications
2013 / 5 / 30 Page 27
4. Let‘s make DSL
Config File Format
Parser Result
Web Page Image
Target
<LogicalExpression?>Y---[function param]
N---[function param]
if (isLogicalExpression) function(param);
else function(param);
Ex)
<Hydea?>Y---[show ‘hydea’]
N---[show ‘hydeb’]
Ex)
if (isHydea) show(‘hydea’);
else show(‘hydeb’);
URL: ex.com/?p=hydea URL: ex.com/?p=hydeb
2013 / 5 / 30 Page 28
4. Let‘s make DSL
Just write over specification
Make Grammar
start = "<" logic "?>Y---[" function " " param
"]nN---[" function " " param "]"
logic = [a-zA-Z]+
function = [a-zA-Z]+
param = "'" [a-zA-Z]+ "'"
2013 / 5 / 30 Page 29
4. Let‘s make DSL
Refactoring a little bit
Make Grammar
start = "<" identifier "?>Y---[" identifier " " param
"]nN---[" identifier " " param "]"
param = "'" identifier "'"
identifier = [a-zA-Z]+
2013 / 5 / 30 Page 30
4. Let‘s make DSL
Finish to make param and identifier part
Make Grammar
start = "<" identifier "?>Y---[" identifier " " param
"]nN---[" identifier " " param "]"
param
= "'" id:identifier "'"
{return "'" + id + "'"; }
identifier
= chars:[a-zA-Z]+
{return chars.join(""); }
2013 / 5 / 30 Page 31
4. Let‘s make DSL
Organize Function Part
Make Grammar
start = "<" identifier "?>Y---[" function
"]nN---[" function "]"
function
= id:identifier " " param:param
{return id + "(" + param + ")"; }
param
= "'" id:identifier "'"
{return "'" + id + "'"; }
identifier
= chars:[a-zA-Z]+
{return chars.join(""); }
2013 / 5 / 30 Page 32
4. Let‘s make DSL
Finish to make
Make Grammar
start
= "<" id:identifier "?>Y---[" f1:function
"]nN---[" f2:function "]"
{return "if (is" + id + ") " + f1 + ";nelse " + f2 + ";"; }
function
= id:identifier " " param:param
{return id + "(" + param + ")"; }
param
= "'" id:identifier "'"
{return "'" + id + "'"; }
identifier
= chars:[a-zA-Z]+
{return chars.join(""); }
2013 / 5 / 30
Agenda
Page 33
Table of Contents
1.How to make parser
2. What’s PEG.js
3. Try to used to be PEG
4. Let’s make DSL
5.Applications
2013 / 5 / 30 Page 34
5. Application
Show My Demo(Demo’s grammar)
start = tree
tree = stat:statement? { return stat; }
statement = stat:if_statement { return stat.toString(); }
/ stat:proc_statement { return stat.toString(); }
if_statement = fac:if_factor 'Y' edge branch1:proc_statement 'n'
'N' 'n' edge branch2:statement
{ return branch2.toString().match(/if/) ?
"if (" + fac + ")nt" + branch1 + 'nelse ' + branch2
: 'if (' + fac + ')nt' + branch1 + 'nelsent' + branch2;}
proc_statement = fac1:proc_factor [-|]+ fac2:proc_statement { return fac1 + '.then(' + fac2.slice(0,fac2.length-1) + ');'; }
/ factor:proc_factor { return factor + ';'; }
proc_factor = '[' procexp:expression ']' { return procexp; }
if_factor = '<' ifexp:expression '>' { return ifexp; }
expression = elem:element ' ' cdr:arguments { return elem.toString() + '(' +cdr + ')'; }
/ elem:element { return elem.toString(); }
arguments = elem:element ',' arg:arguments { return elem.toString() + ',' + arg; }
/ elem:element { return elem.toString(); }
element
= characters:[a-zA-Z0-9-_."]+ { return characters.join('') }
edge
= symbols:[-|n]+ { return symbols.join('') }
2013 / 5 / 30 Page 35
5. Application
Recommendation
Conf1 Conf2 Conf3 ・・・
Recommendation
Engine
Choose a config file
2013 / 5 / 30
Reference
Page 36
Famous Book for Compiler
2013 / 5 / 30
Thank you
Page 37
Thank you for your listening
1 of 37

Recommended

Use PEG to Write a Programming Language Parser by
Use PEG to Write a Programming Language ParserUse PEG to Write a Programming Language Parser
Use PEG to Write a Programming Language ParserYodalee
1.7K views36 slides
C++ for Java Developers (JavaZone Academy 2018) by
C++ for Java Developers (JavaZone Academy 2018)C++ for Java Developers (JavaZone Academy 2018)
C++ for Java Developers (JavaZone Academy 2018)Patricia Aas
1.4K views56 slides
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK by
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDKEric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDKGuardSquare
675 views46 slides
C++ for Java Developers (JavaZone 2017) by
C++ for Java Developers (JavaZone 2017)C++ for Java Developers (JavaZone 2017)
C++ for Java Developers (JavaZone 2017)Patricia Aas
3.6K views70 slides
Java Full Throttle by
Java Full ThrottleJava Full Throttle
Java Full ThrottleJosé Paumard
1.3K views115 slides
C++ for Java Developers (SwedenCpp Meetup 2017) by
C++ for Java Developers (SwedenCpp Meetup 2017)C++ for Java Developers (SwedenCpp Meetup 2017)
C++ for Java Developers (SwedenCpp Meetup 2017)Patricia Aas
934 views53 slides

More Related Content

What's hot

ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android... by
ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...
ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...Istanbul Tech Talks
301 views68 slides
Groovy Introduction - JAX Germany - 2008 by
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Guillaume Laforge
1K views48 slides
Eric Lafortune - ProGuard and DexGuard for optimization and protection by
Eric Lafortune - ProGuard and DexGuard for optimization and protectionEric Lafortune - ProGuard and DexGuard for optimization and protection
Eric Lafortune - ProGuard and DexGuard for optimization and protectionGuardSquare
2.3K views45 slides
Functional Programming with Groovy by
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyArturo Herrero
13.4K views71 slides
Using Jenkins for Continuous Integration of Perl components OSD2011 by
Using Jenkins for Continuous Integration of Perl components OSD2011 Using Jenkins for Continuous Integration of Perl components OSD2011
Using Jenkins for Continuous Integration of Perl components OSD2011 Jonas Brømsø
10.9K views21 slides
What's New in Groovy 1.6? by
What's New in Groovy 1.6?What's New in Groovy 1.6?
What's New in Groovy 1.6?Guillaume Laforge
697 views45 slides

What's hot(20)

ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android... by Istanbul Tech Talks
ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...
ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...
Eric Lafortune - ProGuard and DexGuard for optimization and protection by GuardSquare
Eric Lafortune - ProGuard and DexGuard for optimization and protectionEric Lafortune - ProGuard and DexGuard for optimization and protection
Eric Lafortune - ProGuard and DexGuard for optimization and protection
GuardSquare 2.3K views
Functional Programming with Groovy by Arturo Herrero
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
Arturo Herrero13.4K views
Using Jenkins for Continuous Integration of Perl components OSD2011 by Jonas Brømsø
Using Jenkins for Continuous Integration of Perl components OSD2011 Using Jenkins for Continuous Integration of Perl components OSD2011
Using Jenkins for Continuous Integration of Perl components OSD2011
Jonas Brømsø10.9K views
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK by GuardSquare
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDKEric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
GuardSquare 730 views
tictactoe groovy by Paul King
tictactoe groovytictactoe groovy
tictactoe groovy
Paul King19.2K views
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策 by kwatch
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
kwatch4.1K views
Thoughts On Learning A New Programming Language by Patricia Aas
Thoughts On Learning A New Programming LanguageThoughts On Learning A New Programming Language
Thoughts On Learning A New Programming Language
Patricia Aas649 views
2016年のPerl (Long version) by charsbar
2016年のPerl (Long version)2016年のPerl (Long version)
2016年のPerl (Long version)
charsbar5.2K views
C# 6.0 - What?! C# is being updated? by Filip Ekberg
C# 6.0 - What?! C# is being updated?C# 6.0 - What?! C# is being updated?
C# 6.0 - What?! C# is being updated?
Filip Ekberg11.5K views
ProGuard / DexGuard Tips and Tricks by netomi
ProGuard / DexGuard Tips and TricksProGuard / DexGuard Tips and Tricks
ProGuard / DexGuard Tips and Tricks
netomi5.4K views
PyCon TW 2017 - PyPy's approach to construct domain-specific language runtime... by Tsundere Chen
PyCon TW 2017 - PyPy's approach to construct domain-specific language runtime...PyCon TW 2017 - PyPy's approach to construct domain-specific language runtime...
PyCon TW 2017 - PyPy's approach to construct domain-specific language runtime...
Tsundere Chen230 views
groovy transforms by Paul King
groovy transformsgroovy transforms
groovy transforms
Paul King3.5K views
Construire son JDK en 10 étapes by José Paumard
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapes
José Paumard906 views
Lambdas and Streams Master Class Part 2 by José Paumard
Lambdas and Streams Master Class Part 2Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2
José Paumard1.2K views

Viewers also liked

何となく勉強した気分になれるパーサ入門 by
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
35.8K views43 slides
20141115_node_school_festival_lt by
20141115_node_school_festival_lt20141115_node_school_festival_lt
20141115_node_school_festival_ltzuqqhi 2
1.7K views49 slides
20140706 zuqqhi2-lsm-v1 by
20140706 zuqqhi2-lsm-v120140706 zuqqhi2-lsm-v1
20140706 zuqqhi2-lsm-v1zuqqhi 2
2.3K views10 slides
ANTLR-ANother Tool for Language Recognition by
ANTLR-ANother Tool for Language RecognitionANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language Recognitionelliando dias
1.9K views17 slides
拡張性のあるPEGパーサの実装 by
拡張性のあるPEGパーサの実装拡張性のあるPEGパーサの実装
拡張性のあるPEGパーサの実装masato
2.1K views33 slides
Goで言語処理系(の途中まで)を作ろう by
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうEsehara Shigeo
4.8K views79 slides

Viewers also liked(17)

何となく勉強した気分になれるパーサ入門 by masayoshi takahashi
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi35.8K views
20141115_node_school_festival_lt by zuqqhi 2
20141115_node_school_festival_lt20141115_node_school_festival_lt
20141115_node_school_festival_lt
zuqqhi 21.7K views
20140706 zuqqhi2-lsm-v1 by zuqqhi 2
20140706 zuqqhi2-lsm-v120140706 zuqqhi2-lsm-v1
20140706 zuqqhi2-lsm-v1
zuqqhi 22.3K views
ANTLR-ANother Tool for Language Recognition by elliando dias
ANTLR-ANother Tool for Language RecognitionANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language Recognition
elliando dias1.9K views
拡張性のあるPEGパーサの実装 by masato
拡張性のあるPEGパーサの実装拡張性のあるPEGパーサの実装
拡張性のあるPEGパーサの実装
masato 2.1K views
Goで言語処理系(の途中まで)を作ろう by Esehara Shigeo
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろう
Esehara Shigeo4.8K views
Racc でおてがる構文解析 by morphine57
Racc でおてがる構文解析Racc でおてがる構文解析
Racc でおてがる構文解析
morphine574.3K views
新卒で即戦力なエンジニアになる by Shota Okutsu
新卒で即戦力なエンジニアになる新卒で即戦力なエンジニアになる
新卒で即戦力なエンジニアになる
Shota Okutsu3.9K views
L-1グランプリ "D言語" by det coder
L-1グランプリ "D言語"L-1グランプリ "D言語"
L-1グランプリ "D言語"
det coder3.1K views
Parsing Left Recursive PEG by Takayuki Goto
Parsing Left Recursive PEGParsing Left Recursive PEG
Parsing Left Recursive PEG
Takayuki Goto2.2K views
"Programming Hive" Reading #1 by moai kids
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1
moai kids10K views
正しいマインドマップの使い方・描き方 by webcampusschoo
正しいマインドマップの使い方・描き方正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方
webcampusschoo4.8K views
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る by Masahiro Wakame
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
Masahiro Wakame13.6K views
競技プログラミング頻出アルゴリズム攻略 by K Moneto
競技プログラミング頻出アルゴリズム攻略競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略
K Moneto25.3K views
青空文庫テキストフォーマットについて (aozorahack) by masayoshi takahashi
青空文庫テキストフォーマットについて (aozorahack)青空文庫テキストフォーマットについて (aozorahack)
青空文庫テキストフォーマットについて (aozorahack)
masayoshi takahashi4.9K views

Similar to 20130530-PEGjs

Go 1.10 Release Party - PDX Go by
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoRodolfo Carvalho
344 views45 slides
Groovy Update - JavaPolis 2007 by
Groovy Update - JavaPolis 2007Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Guillaume Laforge
738 views47 slides
2007 09 10 Fzi Training Groovy Grails V Ws by
2007 09 10 Fzi Training Groovy Grails V Ws2007 09 10 Fzi Training Groovy Grails V Ws
2007 09 10 Fzi Training Groovy Grails V Wsloffenauer
1.3K views58 slides
Ecmascript 2015 – best of new features() by
Ecmascript 2015 – best of new features()Ecmascript 2015 – best of new features()
Ecmascript 2015 – best of new features()Miłosz Sobczak
863 views38 slides
Groovy by
GroovyGroovy
GroovyZen Urban
1.1K views35 slides
Groovy On Trading Desk (2010) by
Groovy On Trading Desk (2010)Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)Jonathan Felch
2K views40 slides

Similar to 20130530-PEGjs(20)

2007 09 10 Fzi Training Groovy Grails V Ws by loffenauer
2007 09 10 Fzi Training Groovy Grails V Ws2007 09 10 Fzi Training Groovy Grails V Ws
2007 09 10 Fzi Training Groovy Grails V Ws
loffenauer1.3K views
Ecmascript 2015 – best of new features() by Miłosz Sobczak
Ecmascript 2015 – best of new features()Ecmascript 2015 – best of new features()
Ecmascript 2015 – best of new features()
Miłosz Sobczak863 views
Groovy by Zen Urban
GroovyGroovy
Groovy
Zen Urban1.1K views
Aspect-oriented programming in Perl by megakott
Aspect-oriented programming in PerlAspect-oriented programming in Perl
Aspect-oriented programming in Perl
megakott905 views
GPars For Beginners by Matt Passell
GPars For BeginnersGPars For Beginners
GPars For Beginners
Matt Passell3.5K views
Groovy and Grails talk by desistartups
Groovy and Grails talkGroovy and Grails talk
Groovy and Grails talk
desistartups577 views
Golang basics for Java developers - Part 1 by Robert Stern
Golang basics for Java developers - Part 1Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1
Robert Stern1.3K views
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge by Guillaume Laforge
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume LaforgeGroovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
Guillaume Laforge1.1K views
Roundarch Isobar Java script coding standards by yoav-netcraft
Roundarch Isobar Java script coding standardsRoundarch Isobar Java script coding standards
Roundarch Isobar Java script coding standards
yoav-netcraft324 views
Geeks Anonymes - Le langage Go by Geeks Anonymes
Geeks Anonymes - Le langage GoGeeks Anonymes - Le langage Go
Geeks Anonymes - Le langage Go
Geeks Anonymes237 views
Domain Specific Languages In Scala Duse3 by Peter Maas
Domain Specific Languages In Scala Duse3Domain Specific Languages In Scala Duse3
Domain Specific Languages In Scala Duse3
Peter Maas1.4K views
Formatting ForThe Masses by Holger Schill
Formatting ForThe MassesFormatting ForThe Masses
Formatting ForThe Masses
Holger Schill477 views
OWF12/PAUG Conf Days Pro guard optimizer and obfuscator for android, eric l... by Paris Open Source Summit
OWF12/PAUG Conf Days Pro guard   optimizer and obfuscator for android, eric l...OWF12/PAUG Conf Days Pro guard   optimizer and obfuscator for android, eric l...
OWF12/PAUG Conf Days Pro guard optimizer and obfuscator for android, eric l...
Good Evils In Perl by Kang-min Liu
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
Kang-min Liu13.8K views
Scripting Oracle Develop 2007 by Tugdual Grall
Scripting Oracle Develop 2007Scripting Oracle Develop 2007
Scripting Oracle Develop 2007
Tugdual Grall950 views
LISA QooxdooTutorial Slides by Tobias Oetiker
LISA QooxdooTutorial SlidesLISA QooxdooTutorial Slides
LISA QooxdooTutorial Slides
Tobias Oetiker1.6K views

Recently uploaded

SUGCON ANZ Presentation V2.1 Final.pptx by
SUGCON ANZ Presentation V2.1 Final.pptxSUGCON ANZ Presentation V2.1 Final.pptx
SUGCON ANZ Presentation V2.1 Final.pptxJack Spektor
22 views34 slides
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t... by
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...Deltares
9 views26 slides
Unleash The Monkeys by
Unleash The MonkeysUnleash The Monkeys
Unleash The MonkeysJacob Duijzer
7 views28 slides
Copilot Prompting Toolkit_All Resources.pdf by
Copilot Prompting Toolkit_All Resources.pdfCopilot Prompting Toolkit_All Resources.pdf
Copilot Prompting Toolkit_All Resources.pdfRiccardo Zamana
8 views4 slides
Advanced API Mocking Techniques by
Advanced API Mocking TechniquesAdvanced API Mocking Techniques
Advanced API Mocking TechniquesDimpy Adhikary
19 views11 slides
Sprint 226 by
Sprint 226Sprint 226
Sprint 226ManageIQ
5 views18 slides

Recently uploaded(20)

SUGCON ANZ Presentation V2.1 Final.pptx by Jack Spektor
SUGCON ANZ Presentation V2.1 Final.pptxSUGCON ANZ Presentation V2.1 Final.pptx
SUGCON ANZ Presentation V2.1 Final.pptx
Jack Spektor22 views
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t... by Deltares
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...
Deltares9 views
Copilot Prompting Toolkit_All Resources.pdf by Riccardo Zamana
Copilot Prompting Toolkit_All Resources.pdfCopilot Prompting Toolkit_All Resources.pdf
Copilot Prompting Toolkit_All Resources.pdf
Riccardo Zamana8 views
Advanced API Mocking Techniques by Dimpy Adhikary
Advanced API Mocking TechniquesAdvanced API Mocking Techniques
Advanced API Mocking Techniques
Dimpy Adhikary19 views
Sprint 226 by ManageIQ
Sprint 226Sprint 226
Sprint 226
ManageIQ5 views
DSD-INT 2023 Exploring flash flood hazard reduction in arid regions using a h... by Deltares
DSD-INT 2023 Exploring flash flood hazard reduction in arid regions using a h...DSD-INT 2023 Exploring flash flood hazard reduction in arid regions using a h...
DSD-INT 2023 Exploring flash flood hazard reduction in arid regions using a h...
Deltares5 views
Team Transformation Tactics for Holistic Testing and Quality (Japan Symposium... by Lisi Hocke
Team Transformation Tactics for Holistic Testing and Quality (Japan Symposium...Team Transformation Tactics for Holistic Testing and Quality (Japan Symposium...
Team Transformation Tactics for Holistic Testing and Quality (Japan Symposium...
Lisi Hocke28 views
Navigating container technology for enhanced security by Niklas Saari by Metosin Oy
Navigating container technology for enhanced security by Niklas SaariNavigating container technology for enhanced security by Niklas Saari
Navigating container technology for enhanced security by Niklas Saari
Metosin Oy13 views
DSD-INT 2023 The Danube Hazardous Substances Model - Kovacs by Deltares
DSD-INT 2023 The Danube Hazardous Substances Model - KovacsDSD-INT 2023 The Danube Hazardous Substances Model - Kovacs
DSD-INT 2023 The Danube Hazardous Substances Model - Kovacs
Deltares8 views
Headless JS UG Presentation.pptx by Jack Spektor
Headless JS UG Presentation.pptxHeadless JS UG Presentation.pptx
Headless JS UG Presentation.pptx
Jack Spektor7 views
DSD-INT 2023 3D hydrodynamic modelling of microplastic transport in lakes - J... by Deltares
DSD-INT 2023 3D hydrodynamic modelling of microplastic transport in lakes - J...DSD-INT 2023 3D hydrodynamic modelling of microplastic transport in lakes - J...
DSD-INT 2023 3D hydrodynamic modelling of microplastic transport in lakes - J...
Deltares9 views
360 graden fabriek by info33492
360 graden fabriek360 graden fabriek
360 graden fabriek
info3349237 views
Generic or specific? Making sensible software design decisions by Bert Jan Schrijver
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx by animuscrm
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx
animuscrm14 views
DSD-INT 2023 Salt intrusion Modelling of the Lauwersmeer, towards a measureme... by Deltares
DSD-INT 2023 Salt intrusion Modelling of the Lauwersmeer, towards a measureme...DSD-INT 2023 Salt intrusion Modelling of the Lauwersmeer, towards a measureme...
DSD-INT 2023 Salt intrusion Modelling of the Lauwersmeer, towards a measureme...
Deltares5 views
Myths and Facts About Hospice Care: Busting Common Misconceptions by Care Coordinations
Myths and Facts About Hospice Care: Busting Common MisconceptionsMyths and Facts About Hospice Care: Busting Common Misconceptions
Myths and Facts About Hospice Care: Busting Common Misconceptions
DSD-INT 2023 Simulation of Coastal Hydrodynamics and Water Quality in Hong Ko... by Deltares
DSD-INT 2023 Simulation of Coastal Hydrodynamics and Water Quality in Hong Ko...DSD-INT 2023 Simulation of Coastal Hydrodynamics and Water Quality in Hong Ko...
DSD-INT 2023 Simulation of Coastal Hydrodynamics and Water Quality in Hong Ko...
Deltares14 views

20130530-PEGjs

  • 1. PEG.js - Javascript Parser Generator - Hidetomo Suzuki
  • 2. 2013 / 5 / 30 Scope Page 2 This MTG Target Understand What’s PEG.js Know How to Use PEG.js Make New DSL and Parser
  • 3. 2013 / 5 / 30 Agenda Page 3 Table of Contents 1.How to make parser 2. What’s PEG.js 3. Try to used to be PEG 4. Let’s make DSL 5.Applications
  • 4. 2013 / 5 / 30 Agenda Page 4 Table of Contents 1.How to make parser 2. What’s PEG.js 3. Try to used to be PEG 4. Let’s make DSL 5.Applications
  • 5. 2013 / 5 / 30 Page 5 1. How to make parser 1. Lexical Analysis(字句解析) 2. Syntactic Parsing(構文解析) 3. Semantic Analysis(意味解析) 4. Intermidiate Code Generation(中間コード生成) 5. Code Optimization(コード最適化) 6. Code Generation(コード生成) General Step of Processing with Compiler Parser
  • 6. 2013 / 5 / 30 Page 6 1. How to make parser 1. Lexical Analysis(字句解析) 2. Syntactic Parsing(構文解析) 3. Semantic Analysis(意味解析) Analysis for Make Parser Make strings(minimum unit of string has semantic) from characters Make tree structure from strings which result of Lexical Analysis Type Check ※ A string of Lexical Analysis is called “Token”.
  • 7. 2013 / 5 / 30 Page 7 1. How to make parser 1. Lexical Analysis position_x = position_x + 2.0 * time  Identifier : position_x  Substitution Symbol : =  Identifier : position_x  Addition Symbol : +  Number : 2.0  Multiple Symbol : *  Identifier : time
  • 8. 2013 / 5 / 30 Page 8 1. How to make parser 2. Syntactic Parsing  Identifier : position_x Substitution Symbol : =  Identifier : position_x Addition Symbol : +  Number : 2.0 Multiple Symbol : *  Identifier : time Substitution Symbol Identifier position_x Expression ExpressionExpression Expression Expression Identifier position_x Number 2.0 Identifier time = + *
  • 9. 2013 / 5 / 30 Page 9 1. How to make parser 3. Semantic Analysis Substitution Symbol Identifier position_x Expression ExpressionExpression Expression Expression Identifier position_x Number Identifier = +  Correct Case : Real Number * Integer Number  Wrong Case : Real Number * Function Pointer 2.0 time *
  • 10. 2013 / 5 / 30 Agenda Page 10 Table of Contents 1.How to make parser 2. What’s PEG.js 3. Try to used to be PEG 4. Let’s make DSL 5.Applications
  • 11. 2013 / 5 / 30 Here comes your footer  2. What‘s PEG.js?  Parser Generator for JavaScript  Use PEG (Parsing Expression Grammar)  Easy to try with the web page Outline of PEG.js http://pegjs.majda.cz/
  • 12. 2013 / 5 / 30 Here comes your footer  2. What‘s PEG.js? PEG(Parsing Expression Grammar) is one of grammar for artificial language. Focus point is how input will be analyzed. What‘s PEG Ex) Simple Expression Grammar which Has Four Arithmetic Operations expression <- addexp addexp <- multiexp (“+” multiexp / “-” multiexp)* multiexp <- number (“*” number / “/” number)* number <- [0-9]+ Accept : 2*3+6/2-5*3 -> multiexp + multiexp – multiexp -> ・・・ Decline : (1+1)*3+6/2-(7-2)*3 -> ?*3+6/2-?*3 -> can’t recognize…
  • 13. 2013 / 5 / 30 Here comes your footer  2. What‘s PEG.js? • Nothing Confusion • Different : “a b / a”, “a / a b” • Easy to use compared with CFG • Don’t need to implement scanner (Lexical Analyzer) • Don’t Express Left Recursive PEG vs CFG(Context Free Grammar) • Confusion Existing • Same : “a b | a”, “a | a b” • Need to implement scanner • Can Express Left Recursive PEG CFG
  • 14. 2013 / 5 / 30 Page 14 2. What‘s PEG.js? 1. Make Grammar with PEG 2. Generate Parser with “pegjs” Command 3. Use the Parser Loaded as a Library Step of Make Parser with PEG.js vim filename.pegjs Pegjs filename.pegjs parser.js <script src=“./parser.js” type=“text/javascript”></script> <script type=“text/javascript”> parser.parse(“something”);
  • 15. 2013 / 5 / 30 Page 15 2. What‘s PEG.js? Install PEG.js # Install Pythonbrew $ curl -kL http://xrl.us/pythonbrewinstall | bash $ vim ~/.bash_profile [[ -s $HOME/.pythonbrew/etc/bashrc ]] && source $HOME/.pythonbrew/etc/bashrc $ source ~/.bashrc $ pythonbrew install 2.7.2 $ pythonbrew switch 2.7.2 # Install Node $ git clone git://github.com/creationix/nvm.git ~/.nvm $ nvm install v0.8.7 $ source ~/.nvm/nvm.sh $ nvm use v0.8.7 $ vim ~/.npmrc $ registry = http://registry.npmjs.org/
  • 16. 2013 / 5 / 30 Page 16 2. What‘s PEG.js? 1. Make Grammar with PEG 2. Generate Parser with “pegjs” Command 3. Use the Parser Loaded as a Library Let’s use PEG.js a little bit $ vim ffirst.pegjs start = addexp addexp = integer ("+" integer / "-" integer)* integer = [0-9]+ $ ./node_modules/pegjs/bin/pegjs first.pegjs parser.js $ vim parser.js 1st line: module.export = … -> var parser = … $ vim index.html <script type=“text/javascript” src=“./parser.js”></script> <script type=“text/javascript”> alert(parser.parse(“1+2+3-5”)); </script>
  • 17. 2013 / 5 / 30 Agenda Page 17 Table of Contents 1.How to make parser 2. What’s PEG.js 3. Try to used to be PEG 4. Let’s make DSL 5.Applications
  • 18. 2013 / 5 / 30 Page 18 3.Try to used to be PEG PEG.js Online Version (http://pegjs.majda.cz/online)
  • 19. 2013 / 5 / 30 Page 19 3. Try to used to be PEG Very Simple PEG.js Grammar(calc : integer) Grammar Test Input Test Input Result start = integer integer = digits:[0-9]+ { return parseInt(digits.join(“”), 10); } 123456789 123456789
  • 20. 2013 / 5 / 30 Page 20 3. Try to used to be PEG Very Simple PEG.js Grammar(calc : add two integer) Grammar Test Input Test Input Result start = target1:integer "+" target2:integer { return target1+target2; } integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 81+19 100
  • 21. 2013 / 5 / 30 Page 21 3. Try to used to be PEG Very Simple PEG.js Grammar(calc : add and minus two integer) Grammar Test Input Test Input Result start = target1:integer "+" target2:integer { return target1+target2; } / target1:integer "-" target2:integer { return target1-target2; } integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 100-19 81
  • 22. 2013 / 5 / 30 Page 22 3. Try to used to be PEG Very Simple PEG.js Grammar(calc : add and minus integers) Grammar Test Input Test Input Result start = expression expression = ope1:integer "+" ope2:expression { return ope1+ope2; } / ope1:integer "-" ope2:expression { return ope1-ope2; } / ope:integer { return ope; } integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 1+2+3+4+5-6+7-8+9-10 9
  • 23. 2013 / 5 / 30 Page 23 3. Try to used to be PEG Very Simple PEG.js Grammar(calc : four arithmetic) Grammar Test Input Test Input Result start = expression expression = ope1:integer "+" ope2:expression { return ope1+ope2; } / ope1:integer "-" ope2:expression { return ope1-ope2; } / ope1:integer "*" ope2:expression { return ope1*ope2; } / ope1:integer "/" ope2:expression { return ope1/ope2; } / ope:integer { return ope; } integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 2*3/2 3
  • 24. 2013 / 5 / 30 Page 24 3. Try to used to be PEG Very Simple PEG.js Grammar(calc : four arithmetic with priority) Grammar Test Input Test Input Result start = expression expression = ope1:multiple "+" ope2:expression { return ope1+ope2; } / ope1:multiple "-" ope2:expression { return ope1-ope2; } / ope:multiple { return ope; } multiple = ope1:integer "*" ope2:multiple { return ope1*ope2; } / ope1:integer "/" ope2:multiple { return ope1/ope2; } / ope:integer { return ope; } integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 2*3/2+8/4 5
  • 25. 2013 / 5 / 30 Page 25 3. Try to used to be PEG Very Simple PEG.js Grammar(calc : four arithmetic with priority) Grammar Test Input Test Input Result start = expression expression = ope1:multiple "+" ope2:expression { return ope1+ope2; } / ope1:multiple "-" ope2:expression { return ope1-ope2; } / ope:multiple { return ope; } multiple = ope1:bracket "*" ope2:multiple { return ope1*ope2; } / ope1:bracket "/" ope2:multiple { return ope1/ope2; } / ope:bracket { return ope; } bracket = "(" exp:expression ")" {return exp; } / ope:integer {return ope; } integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); } (7+3)*3/2+8/(6-2) 17
  • 26. 2013 / 5 / 30 Agenda Page 26 Table of Contents 1.How to make parser 2. What’s PEG.js 3. Try to used to be PEG 4. Let’s make DSL 5.Applications
  • 27. 2013 / 5 / 30 Page 27 4. Let‘s make DSL Config File Format Parser Result Web Page Image Target <LogicalExpression?>Y---[function param] N---[function param] if (isLogicalExpression) function(param); else function(param); Ex) <Hydea?>Y---[show ‘hydea’] N---[show ‘hydeb’] Ex) if (isHydea) show(‘hydea’); else show(‘hydeb’); URL: ex.com/?p=hydea URL: ex.com/?p=hydeb
  • 28. 2013 / 5 / 30 Page 28 4. Let‘s make DSL Just write over specification Make Grammar start = "<" logic "?>Y---[" function " " param "]nN---[" function " " param "]" logic = [a-zA-Z]+ function = [a-zA-Z]+ param = "'" [a-zA-Z]+ "'"
  • 29. 2013 / 5 / 30 Page 29 4. Let‘s make DSL Refactoring a little bit Make Grammar start = "<" identifier "?>Y---[" identifier " " param "]nN---[" identifier " " param "]" param = "'" identifier "'" identifier = [a-zA-Z]+
  • 30. 2013 / 5 / 30 Page 30 4. Let‘s make DSL Finish to make param and identifier part Make Grammar start = "<" identifier "?>Y---[" identifier " " param "]nN---[" identifier " " param "]" param = "'" id:identifier "'" {return "'" + id + "'"; } identifier = chars:[a-zA-Z]+ {return chars.join(""); }
  • 31. 2013 / 5 / 30 Page 31 4. Let‘s make DSL Organize Function Part Make Grammar start = "<" identifier "?>Y---[" function "]nN---[" function "]" function = id:identifier " " param:param {return id + "(" + param + ")"; } param = "'" id:identifier "'" {return "'" + id + "'"; } identifier = chars:[a-zA-Z]+ {return chars.join(""); }
  • 32. 2013 / 5 / 30 Page 32 4. Let‘s make DSL Finish to make Make Grammar start = "<" id:identifier "?>Y---[" f1:function "]nN---[" f2:function "]" {return "if (is" + id + ") " + f1 + ";nelse " + f2 + ";"; } function = id:identifier " " param:param {return id + "(" + param + ")"; } param = "'" id:identifier "'" {return "'" + id + "'"; } identifier = chars:[a-zA-Z]+ {return chars.join(""); }
  • 33. 2013 / 5 / 30 Agenda Page 33 Table of Contents 1.How to make parser 2. What’s PEG.js 3. Try to used to be PEG 4. Let’s make DSL 5.Applications
  • 34. 2013 / 5 / 30 Page 34 5. Application Show My Demo(Demo’s grammar) start = tree tree = stat:statement? { return stat; } statement = stat:if_statement { return stat.toString(); } / stat:proc_statement { return stat.toString(); } if_statement = fac:if_factor 'Y' edge branch1:proc_statement 'n' 'N' 'n' edge branch2:statement { return branch2.toString().match(/if/) ? "if (" + fac + ")nt" + branch1 + 'nelse ' + branch2 : 'if (' + fac + ')nt' + branch1 + 'nelsent' + branch2;} proc_statement = fac1:proc_factor [-|]+ fac2:proc_statement { return fac1 + '.then(' + fac2.slice(0,fac2.length-1) + ');'; } / factor:proc_factor { return factor + ';'; } proc_factor = '[' procexp:expression ']' { return procexp; } if_factor = '<' ifexp:expression '>' { return ifexp; } expression = elem:element ' ' cdr:arguments { return elem.toString() + '(' +cdr + ')'; } / elem:element { return elem.toString(); } arguments = elem:element ',' arg:arguments { return elem.toString() + ',' + arg; } / elem:element { return elem.toString(); } element = characters:[a-zA-Z0-9-_."]+ { return characters.join('') } edge = symbols:[-|n]+ { return symbols.join('') }
  • 35. 2013 / 5 / 30 Page 35 5. Application Recommendation Conf1 Conf2 Conf3 ・・・ Recommendation Engine Choose a config file
  • 36. 2013 / 5 / 30 Reference Page 36 Famous Book for Compiler
  • 37. 2013 / 5 / 30 Thank you Page 37 Thank you for your listening