diff --git a/lib/extglob.js b/lib/extglob.js
index 015f928..8b3ec04 100644
--- a/lib/extglob.js
+++ b/lib/extglob.js
@@ -22,6 +22,9 @@ var parsers = require('./parsers');
function Extglob(options) {
this.options = extend({source: 'extglob'}, options);
this.snapdragon = this.options.snapdragon || new Snapdragon(this.options);
+
+ this.snapdragon.use(capture())
+
this.snapdragon.patterns = this.snapdragon.patterns || {};
this.compiler = this.snapdragon.compiler;
this.parser = this.snapdragon.parser;
diff --git a/lib/parsers.js b/lib/parsers.js
index 2ba7352..670e44a 100644
--- a/lib/parsers.js
+++ b/lib/parsers.js
@@ -31,7 +31,7 @@ function parsers(extglob) {
* Extglob open: "*("
*/
- .capture('paren.open', function() {
+ .set('paren.open', function() {
var parsed = this.parsed;
var pos = this.position();
var m = this.match(/^([!@*?+])?\(/);
@@ -72,7 +72,7 @@ function parsers(extglob) {
* Extglob close: ")"
*/
- .capture('paren.close', function() {
+ .set('paren.close', function() {
var parsed = this.parsed;
var pos = this.position();
var m = this.match(/^\)/);
@@ -103,7 +103,7 @@ function parsers(extglob) {
* Escape: "\\."
*/
- .capture('escape', function() {
+ .set('escape', function() {
var pos = this.position();
var m = this.match(/^\\(.)/);
if (!m) return;
@@ -119,7 +119,7 @@ function parsers(extglob) {
* Question marks: "?"
*/
- .capture('qmark', function() {
+ .set('qmark', function() {
var parsed = this.parsed;
var pos = this.position();
var m = this.match(/^\?+(?!\()/);
@@ -137,10 +137,47 @@ function parsers(extglob) {
* Character parsers
*/
- .capture('star', /^\*(?!\()/)
- .capture('plus', /^\+(?!\()/)
- .capture('dot', /^\./)
- .capture('text', not);
+ .set('star', function() {
+ var parsed = this.parse;
+ var pos = this.position();
+ var m = this.match(/^\*(?!\()/);
+ if (!m) return;
+ return pos({
+ type: 'star',
+ val: m[0]
+ });
+ })
+ .set('plus', function() {
+ var parsed = this.parse;
+ var pos = this.position();
+ var m = this.match(/^\+(?!\()/);
+ if (!m) return;
+ return pos({
+ type: 'star',
+ val: m[0]
+ });
+ })
+ .set('dot', function() {
+ var parsed = this.parse;
+ var pos = this.position();
+ var m = this.match(/^\./);
+ if (!m) return;
+ return pos({
+ type: 'dot',
+ val: m[0]
+ });
+ })
+ .set('text', function() {
+ var pos = this.position();
+ var m = this.match(not);
+ if (!m || !m[0]) return;
+
+ return pos({
+ type: 'text',
+ val: m[0]
+ });
+ });
+
};
/**