Skip to content

Commit

Permalink
feat: general parser improvements and features (#45, #44, #42, #39, #31)
Browse files Browse the repository at this point in the history
  • Loading branch information
h2non committed Feb 12, 2014
1 parent e730c86 commit 69cb756
Show file tree
Hide file tree
Showing 11 changed files with 885 additions and 426 deletions.
22 changes: 19 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,31 @@ To disable the automatic parsing, just add `data-ignore` attribute in the script
- [x] Clone and inheritance
- [*] Errors
- [_] Optimiser
- [*] REPL
- [*] Event-driven
- Interfaces
- [x] API
- [x] CLI
- [x] REPL
- **Serializer**
- [_] JSON to Oli
- [_] Concret Sintax Tree to Oli
- **Environments**
- [X] Node.js
- [X] Browser
- [x] Node.js
- [x] Browser
- [?] Rhino

#### Upcoming features

There are important features in Oli language spec 0.2. You can see the future features discussion [here](https://github.com/oli-lang/oli/issues?labels=discussion&milestone=1&page=1&state=open)

A summary about most important features applied to oli.js

- Support for interpolated code expressions (https://github.com/oli-lang/oli/issues/3)
- Support for generic helper functions (random, string format, date format...)
- Helpers functions extension via API
- Support for control flow structures
- Indent-based blocks

## Command-line interface

```
Expand Down
29 changes: 23 additions & 6 deletions grammar/expressions.peg
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ PrimitiveTerminatorSequence
// to do: separate rule in especific expressions contexts
PrimitiveValueExpression
= exp:BooleanLiteral _ PrimitiveTerminatorSequence { return exp; }
/ exp:NilLiteral _ PrimitiveTerminatorSequence { return exp; }
/ exp:ReferenceExpression _ PrimitiveTerminatorSequence { return exp; }
/ exp:NumberLiteral _ PrimitiveTerminatorSequence { return exp; }
/ StringLiteral
Expand All @@ -35,7 +36,7 @@ UnquotedStringLiteral "unquoted literal"
}

UnquotedStringListLiteral "unquoted literal"
= !"-" _ chars:LiteralSequenceListCharacters+ _ ("," / &EOS) {
= !"-" _ chars:LiteralSequenceListCharacters+ {
return astNode({
type: 'StringLiteral',
value: chars.join('').trim(),
Expand Down Expand Up @@ -219,22 +220,38 @@ IdentifierAttributesExpression

IdentifierExpression
= !"-" _ id:IdentifierNameExpression
__ expression:IdentifierOperationExpression?
__ expr:IdentifierOperationExpression?
__ attrs:IdentifierAttributesExpression? {
return astNode({
type: 'IdentifierExpression',
id: id,
expression: expression,
expression: expr,
attributes: attrs
});
}

/* List */
IdenfitierAttributeExpression
= !"-" _ id:IdentifierNameExpression
__ attrs:IdentifierAttributesExpression {
return astNode({
type: 'IdentifierExpression',
id: id,
attributes: attrs
});
}

/* Lists */

InLineListExpression
= "-" _ elements:InLineListBlockStatement { return elements; }

BracketListExpression
= "[" __ elements:ListBlockStatement __ "]" { return elements; }

ListExpression
= elements:(
"-" _ elements:ListBlockStatement _ EOS { return elements; }
/ "[" __ elements:ListBlockStatement __ "]" { return elements; }) {
InLineListExpression
/ BracketListExpression) {
return astNode({
type: 'ListExpression',
elements: elements !== null ? elements : []
Expand Down
10 changes: 10 additions & 0 deletions grammar/oli.peg
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{
var toString = Object.prototype.toString;

// parsing options
var includeLOC = options.loc;
var includeComments = options.comments;
Expand Down Expand Up @@ -42,6 +44,14 @@
comments.push(node)
}
}

function isArray(obj) {
if (Array.isArray) {
return Array.isArray(obj)
} else {
return toString.call(obj) === '[object Array]'
}
}
}

start
Expand Down
9 changes: 9 additions & 0 deletions grammar/primitives.peg
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@ BooleanLiteral
})
}

NilLiteral "nil"
= NilToken {
return astNode({
type: 'NilLiteral',
value: null,
raw: 'nil'
})
}

NumberLiteral "number"
= number:(HexIntegerLiteral / DecimalLiteral / IntegerLiteral) {
return number;
Expand Down
40 changes: 27 additions & 13 deletions grammar/statements.peg
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ PrimitiveTypeStatement
MainStatement
= Comment
/ BlockPipeStatement
/ BlockAttributeStatement
/ ValueStatement
/ BlockStatement

Expand All @@ -19,30 +20,35 @@ ListElementStatement
/ PrimitiveValueExpression
/ UnquotedStringListLiteral

BlockAsignmentOperator
= operator:(
VariableAssignOperator
/ AsignNotOperator
/ AsignRawOperator
/ AsignUnfoldOperator
/ AsignFoldOperator
/ StartToken) {
return Array.isArray(operator) ? operator.join('') : operator;
}
InLineListElementsStatement
= Comment
/ ValueStatement
/ BlockAttributeStatement
/ PrimitiveValueExpression
/ UnquotedStringListLiteral

ListBlockStatement
= head:ListElementStatement tail:(__ ElementSeparator? __ ListElementStatement)* {
var result = [ head ];
for (var i = 0, l = tail.length; i < l; i+=1) {
for (var i = 0, l = tail.length; i < l; i += 1) {
result.push(tail[i][3]);
}
return result;
}

InLineListBlockStatement
= head:InLineListElementsStatement tail:(_ "," _ el:InLineListElementsStatement { return el; })* {
var result = [ head ];
for (var i = 0, l = tail.length; i < l; i += 1) {
result.push(tail[i]);
}
return result;
}

BlockElementStatement
= head:Statement tail:(__ ElementSeparator? __ Statement)* {
var result = [ head ];
for (var i = 0, l = tail.length; i < l; i+=1) {
for (var i = 0, l = tail.length; i < l; i += 1) {
result.push(tail[i][3]);
}
return result;
Expand Down Expand Up @@ -87,7 +93,7 @@ BlockPipeStatement
= PipeOperator? __ id:IdentifierExpression __ operator:BlockAsignmentOperator
__ head:PipeStatement __ tail:(__ PipeStatement)* {
var body = [ head ];
for (var i = 0, l = tail.length; i < l; i+=1) {
for (var i = 0, l = tail.length; i < l; i += 1) {
body.push(tail[i][1]);
}
return astNode({
Expand All @@ -104,6 +110,14 @@ BlockPipeStatement
});
}

BlockAttributeStatement
= expr:IdenfitierAttributeExpression _ EOS {
return astNode({
type: 'ExpressionStatement',
expression: expr
})
}

BlockStatement
= id:IdentifierExpression __ operator:BlockAsignmentOperator
__ body:BlockElementStatement __ EndToken
Expand Down
14 changes: 14 additions & 0 deletions grammar/tokens.peg
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,28 @@ StartToken = AsignOperator !IdentifierPart
TrueToken = "true" / "yes" !IdentifierPart
FalseToken = "false" / "no" !IdentifierPart
EndToken "end of block" = "end" !IdentifierPart
NilToken "nil" = "nil" !IdentifierPart

Keyword
= (
StartToken
/ EndToken
/ NilToken
/ RelationalNotOperator
)
!IdentifierPart

BlockAsignmentOperator
= operator:(
VariableAssignOperator
/ AsignNotOperator
/ AsignRawOperator
/ AsignUnfoldOperator
/ AsignFoldOperator
/ StartToken) {
return isArray(operator) ? operator.join('') : operator;
}

ReservedWord
= Keyword

Expand Down
1 change: 1 addition & 0 deletions lib/compiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ function traverse(node) {
case 'DecimalLiteral':
case 'HexadecimalLiteral':
case 'BooleanLiteral':
case 'NilLiteral':
val = node.value
break
case 'ExpressionStatement':
Expand Down
Loading

0 comments on commit 69cb756

Please sign in to comment.