人気ブログランキング | 話題のタグを見る

フルスペック PEG パーサジェネレータ: P モジュール

// Simple Pattern Matcher Module
// parse.js
// written by tnomura, Feb. 20, 2016
// This is a public domain software

P = (function() {

var line = ""
stack = []

function setline( ln ) { line = ln }
function getline() { return line }
function push( dat ) { stack.push( dat ) }
function pop() { return stack.pop() }
function getstack() { return stack }

function lex( re ) {
return function() {
var match = line.match( re )
if ( match ) {
line = line.replace( re, "" )
stack.push( match[0] )
return true
} else {
return false
}
}
}

function pat( pattern, action ) {
return function () {
var trackback = line
var stacklength = stack.length
if (pattern()) {
action()
return true
} else {
line = trackback
stack = stack.slice(0, stacklength)
return false
}
}
}

function andpred ( pattern ) {
return function () {
var trackback = line
var stacklength = stack.length
if (pattern()) {
line = trackback
stack = stack.slice(0, stacklength)
return true
} else {
line = trackback
stack = stack.slice(0, stacklength)
return false
}
}
}

function notpred( pattern ) {
return function () {
var trackback = line
var stacklength = stack.length
if (pattern()) {
line = trackback
stack = stack.slice(0, stacklength)
return false
} else {
line = trackback
stack = stack.slice(0, stacklength)
return true
}
}
}

function many( pattern ) {
return function() {
while( pattern() ) {}
return true
}
}


return {
setLine: setline,
getLine: getline,
push: push,
pop: pop,
getStack: getstack,
lex: lex,
pat: pat,
andPred: andpred,
notPred: notpred,
many: many,
}

})()


by tnomura9 | 2016-02-20 05:59 | JavaScript | Comments(0)
<< 正規表現で構文解析 変数つき1行電卓 >>