| var TYPE = require('../../tokenizer').TYPE; |
| |
| var WHITESPACE = TYPE.WhiteSpace; |
| var COMMENT = TYPE.Comment; |
| var IDENTIFIER = TYPE.Identifier; |
| var FUNCTION = TYPE.Function; |
| var LEFTPARENTHESIS = TYPE.LeftParenthesis; |
| var HYPHENMINUS = TYPE.HyphenMinus; |
| var COLON = TYPE.Colon; |
| |
| function consumeRaw() { |
| return this.createSingleNodeList( |
| this.Raw(this.scanner.currentToken, 0, 0, false, false) |
| ); |
| } |
| |
| function parentheses() { |
| var index = 0; |
| |
| this.scanner.skipSC(); |
| |
| // TODO: make it simplier |
| if (this.scanner.tokenType === IDENTIFIER) { |
| index = 1; |
| } else if (this.scanner.tokenType === HYPHENMINUS && |
| this.scanner.lookupType(1) === IDENTIFIER) { |
| index = 2; |
| } |
| |
| if (index !== 0 && this.scanner.lookupNonWSType(index) === COLON) { |
| return this.createSingleNodeList( |
| this.Declaration() |
| ); |
| } |
| |
| return readSequence.call(this); |
| } |
| |
| function readSequence() { |
| var children = this.createList(); |
| var space = null; |
| var child; |
| |
| this.scanner.skipSC(); |
| |
| scan: |
| while (!this.scanner.eof) { |
| switch (this.scanner.tokenType) { |
| case WHITESPACE: |
| space = this.WhiteSpace(); |
| continue; |
| |
| case COMMENT: |
| this.scanner.next(); |
| continue; |
| |
| case FUNCTION: |
| child = this.Function(consumeRaw, this.scope.AtrulePrelude); |
| break; |
| |
| case IDENTIFIER: |
| child = this.Identifier(); |
| break; |
| |
| case LEFTPARENTHESIS: |
| child = this.Parentheses(parentheses, this.scope.AtrulePrelude); |
| break; |
| |
| default: |
| break scan; |
| } |
| |
| if (space !== null) { |
| children.push(space); |
| space = null; |
| } |
| |
| children.push(child); |
| } |
| |
| return children; |
| } |
| |
| module.exports = { |
| parse: { |
| prelude: function() { |
| var children = readSequence.call(this); |
| |
| if (this.getFirstListNode(children) === null) { |
| this.scanner.error('Condition is expected'); |
| } |
| |
| return children; |
| }, |
| block: function() { |
| return this.Block(false); |
| } |
| } |
| }; |