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

More Related Content

PDF
Use PEG to Write a Programming Language Parser
PDF
C++ for Java Developers (JavaZone Academy 2018)
PDF
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
PDF
C++ for Java Developers (JavaZone 2017)
PDF
Java Full Throttle
PDF
C++ for Java Developers (SwedenCpp Meetup 2017)
PPT
Perl Tidy Perl Critic
PDF
Secure Programming Practices in C++ (NDC Security 2018)
Use PEG to Write a Programming Language Parser
C++ for Java Developers (JavaZone Academy 2018)
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
C++ for Java Developers (JavaZone 2017)
Java Full Throttle
C++ for Java Developers (SwedenCpp Meetup 2017)
Perl Tidy Perl Critic
Secure Programming Practices in C++ (NDC Security 2018)

What's hot (20)

PPT
Groovy Introduction - JAX Germany - 2008
PDF
Eric Lafortune - ProGuard and DexGuard for optimization and protection
PDF
Functional Programming with Groovy
PDF
Using Jenkins for Continuous Integration of Perl components OSD2011
PPT
What's New in Groovy 1.6?
PPTX
C# Is The Future
PDF
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
PDF
tictactoe groovy
PDF
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
PDF
Thoughts On Learning A New Programming Language
PPT
2016年のPerl (Long version)
PPTX
C# 6.0 - What?! C# is being updated?
PPTX
Golang for OO Programmers
PDF
Clean coding-practices
PDF
ProGuard / DexGuard Tips and Tricks
PDF
PyCon TW 2017 - PyPy's approach to construct domain-specific language runtime...
PPTX
groovy transforms
PDF
Construire son JDK en 10 étapes
PDF
Lambdas and Streams Master Class Part 2
PDF
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
Groovy Introduction - JAX Germany - 2008
Eric Lafortune - ProGuard and DexGuard for optimization and protection
Functional Programming with Groovy
Using Jenkins for Continuous Integration of Perl components OSD2011
What's New in Groovy 1.6?
C# Is The Future
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
tictactoe groovy
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
Thoughts On Learning A New Programming Language
2016年のPerl (Long version)
C# 6.0 - What?! C# is being updated?
Golang for OO Programmers
Clean coding-practices
ProGuard / DexGuard Tips and Tricks
PyCon TW 2017 - PyPy's approach to construct domain-specific language runtime...
groovy transforms
Construire son JDK en 10 étapes
Lambdas and Streams Master Class Part 2
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
Ad

Viewers also liked (17)

PDF
何となく勉強した気分になれるパーサ入門
PPTX
20141115_node_school_festival_lt
PPT
20140706 zuqqhi2-lsm-v1
PPT
ANTLR-ANother Tool for Language Recognition
PDF
拡張性のあるPEGパーサの実装
PDF
Goで言語処理系(の途中まで)を作ろう
ODP
Racc でおてがる構文解析
PDF
PEGの回文っぽいExpression
PDF
新卒で即戦力なエンジニアになる
PDF
L-1グランプリ "D言語"
PPT
Parsing Left Recursive PEG
PDF
Introduction to PEG
PDF
"Programming Hive" Reading #1
PDF
正しいマインドマップの使い方・描き方
PDF
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
PDF
競技プログラミング頻出アルゴリズム攻略
PDF
青空文庫テキストフォーマットについて (aozorahack)
何となく勉強した気分になれるパーサ入門
20141115_node_school_festival_lt
20140706 zuqqhi2-lsm-v1
ANTLR-ANother Tool for Language Recognition
拡張性のあるPEGパーサの実装
Goで言語処理系(の途中まで)を作ろう
Racc でおてがる構文解析
PEGの回文っぽいExpression
新卒で即戦力なエンジニアになる
L-1グランプリ "D言語"
Parsing Left Recursive PEG
Introduction to PEG
"Programming Hive" Reading #1
正しいマインドマップの使い方・描き方
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
競技プログラミング頻出アルゴリズム攻略
青空文庫テキストフォーマットについて (aozorahack)
Ad

Similar to 20130530-PEGjs (20)

PDF
Go 1.10 Release Party - PDX Go
PPT
Groovy Update - JavaPolis 2007
PPT
2007 09 10 Fzi Training Groovy Grails V Ws
PDF
Ecmascript 2015 – best of new features()
PPTX
Groovy
PDF
Groovy On Trading Desk (2010)
ODP
Aspect-oriented programming in Perl
PDF
GPars For Beginners
PDF
Groovy and Grails talk
PPTX
Golang basics for Java developers - Part 1
PDF
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
PDF
Roundarch Isobar Java script coding standards
PDF
Geeks Anonymes - Le langage Go
ODP
Domain Specific Languages In Scala Duse3
PDF
Formatting ForThe Masses
PDF
OWF12/PAUG Conf Days Pro guard optimizer and obfuscator for android, eric l...
PDF
Dutch PHP Conference 2013: Distilled
PDF
Good Evils In Perl
PPT
Scripting Oracle Develop 2007
PDF
LISA QooxdooTutorial Slides
Go 1.10 Release Party - PDX Go
Groovy Update - JavaPolis 2007
2007 09 10 Fzi Training Groovy Grails V Ws
Ecmascript 2015 – best of new features()
Groovy
Groovy On Trading Desk (2010)
Aspect-oriented programming in Perl
GPars For Beginners
Groovy and Grails talk
Golang basics for Java developers - Part 1
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
Roundarch Isobar Java script coding standards
Geeks Anonymes - Le langage Go
Domain Specific Languages In Scala Duse3
Formatting ForThe Masses
OWF12/PAUG Conf Days Pro guard optimizer and obfuscator for android, eric l...
Dutch PHP Conference 2013: Distilled
Good Evils In Perl
Scripting Oracle Develop 2007
LISA QooxdooTutorial Slides

Recently uploaded (20)

PDF
AI Guide for Business Growth - Arna Softech
PPTX
Cybersecurity-and-Fraud-Protecting-Your-Digital-Life.pptx
PPTX
Trending Python Topics for Data Visualization in 2025
PDF
Multiverse AI Review 2025: Access All TOP AI Model-Versions!
PDF
novaPDF Pro 11.9.482 Crack + License Key [Latest 2025]
PDF
AI/ML Infra Meetup | LLM Agents and Implementation Challenges
PPTX
GSA Content Generator Crack (2025 Latest)
PDF
BoxLang Dynamic AWS Lambda - Japan Edition
PPTX
Introduction to Windows Operating System
PDF
Topaz Photo AI Crack New Download (Latest 2025)
DOC
UTEP毕业证学历认证,宾夕法尼亚克拉里恩大学毕业证未毕业
PDF
CCleaner 6.39.11548 Crack 2025 License Key
PPTX
Computer Software - Technology and Livelihood Education
PDF
Salesforce Agentforce AI Implementation.pdf
PDF
Ableton Live Suite for MacOS Crack Full Download (Latest 2025)
PDF
AI-Powered Threat Modeling: The Future of Cybersecurity by Arun Kumar Elengov...
PDF
DNT Brochure 2025 – ISV Solutions @ D365
PPTX
Full-Stack Developer Courses That Actually Land You Jobs
PDF
Guide to Food Delivery App Development.pdf
PPTX
most interesting chapter in the world ppt
AI Guide for Business Growth - Arna Softech
Cybersecurity-and-Fraud-Protecting-Your-Digital-Life.pptx
Trending Python Topics for Data Visualization in 2025
Multiverse AI Review 2025: Access All TOP AI Model-Versions!
novaPDF Pro 11.9.482 Crack + License Key [Latest 2025]
AI/ML Infra Meetup | LLM Agents and Implementation Challenges
GSA Content Generator Crack (2025 Latest)
BoxLang Dynamic AWS Lambda - Japan Edition
Introduction to Windows Operating System
Topaz Photo AI Crack New Download (Latest 2025)
UTEP毕业证学历认证,宾夕法尼亚克拉里恩大学毕业证未毕业
CCleaner 6.39.11548 Crack 2025 License Key
Computer Software - Technology and Livelihood Education
Salesforce Agentforce AI Implementation.pdf
Ableton Live Suite for MacOS Crack Full Download (Latest 2025)
AI-Powered Threat Modeling: The Future of Cybersecurity by Arun Kumar Elengov...
DNT Brochure 2025 – ISV Solutions @ D365
Full-Stack Developer Courses That Actually Land You Jobs
Guide to Food Delivery App Development.pdf
most interesting chapter in the world ppt

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