Skip to content

Commit

Permalink
Merge pull request #31 from NogginBops/grammar-fixes
Browse files Browse the repository at this point in the history
Grammar fixes
NogginBops authored Feb 14, 2017
2 parents 779f72f + c32855b commit d6e39f8
Showing 6 changed files with 815 additions and 639 deletions.
113 changes: 26 additions & 87 deletions SKON.NET/GrammarProject/SKEMA.ATG
Original file line number Diff line number Diff line change
@@ -4,40 +4,12 @@ using SKON.Internal.Utils;

COMPILER SKEMA

public SKONObject metadata = new SKONObject();
public SKONMetadata metadata = new SKONMetadata();

public SKEMAObject data = SKEMAObject.Any;

public Dictionary<string, SKEMAObject> definitions = new Dictionary<string, SKEMAObject>();

private string[] dateTimeFormats = {
"yyyy-MM-dd",
"hh:mm:ssZ",
"hh:mm:ss.fffZ",
"hh:mm:sszzz",
"hh:mm:ss.fffzzz",
"yyyy-MM-ddThh:mm:ssZ",
"yyyy-MM-ddThh:mm:ss.fffZ",
"yyyy-MM-ddThh:mm:sszzz",
"yyyy-MM-ddThh:mm:ss.fffzzz"
};

private DateTime ParseDatetime(string value)
{
value = value.Substring(1);

DateTime dateTime;

if (DateTime.TryParseExact(value, dateTimeFormats, null, DateTimeStyles.None, out dateTime))
{
return dateTime;
}
else
{
return ParserUtils.UnixTimeStampToDateTime(long.Parse(value));
}
}

/*-------------------------------------------------------------------------*/
CHARACTERS
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_".
@@ -65,9 +37,7 @@ TOKENS
badString = '"' { stringch | '\\' escapech } (cr | lf).
integer_ = ['-'] digit {digit}.
double_ = ['-'] digit {digit} (((dot digit {digit}) [('E' | 'e') [('+' | '-')] digit {digit}]) | (('E' | 'e') [('+' | '-')] digit {digit})).
datetime_ = '@'
(digit {digit}
| digit digit digit digit '-' digit digit '-' digit digit
datetime_ = ( digit digit digit digit '-' digit digit '-' digit digit
| digit digit ':' digit digit ':' digit digit ('Z'|'z')
| digit digit ':' digit digit ':' digit digit '.' digit digit digit ('Z'|'z')
| digit digit ':' digit digit ':' digit digit ('+'|'-') digit digit ':' digit digit
@@ -92,15 +62,34 @@ PRODUCTIONS
SKEMA (. Dictionary<string, SKONObject> metadataElements = new Dictionary<string, SKONObject>();
Dictionary<string, SKEMAObject> mapElements;
Dictionary<string, bool> optionalMap;
string key; SKONObject value; .)
= { meta_data<out key, out value> } (. this.metadata = new SKONObject(metadataElements); .)
int version; string docVersion; string skema; .)
= meta_version<out version> (. metadata.LanguageVersion = version; .)
meta_docVersion<out docVersion> (. metadata.DocuemntVersion = docVersion; .)
[
meta_SKEMA<out skema> (. metadata.SKEMA = skema; .)
]
open_skema_map<out mapElements, out optionalMap> (. this.data = new SKEMAObject(mapElements, optionalMap); .)
.

/*-------------------------------------------------------------------------*/
meta_data<out string key, out SKONObject obj>
meta_version<out int ver>
= tilda
skon_map_element<out key, out obj>
"Version" colon
integer_ (. if (int.TryParse(t.val, out ver) == false) ver = -1; .)
tilda.

/*-------------------------------------------------------------------------*/
meta_docVersion<out string ver>
= tilda
"DocumentVersion" colon
string_ (. if (t.val.Length > 2) ver = ParserUtils.EscapeString(t.val.Substring(1, t.val.Length - 2)); else ver = "INVALID"; .)
tilda.

/*-------------------------------------------------------------------------*/
meta_SKEMA<out string skema>
= tilda
"SKEMA" colon
string_ (. if (t.val.Length > 2) skema = ParserUtils.EscapeString(t.val.Substring(1, t.val.Length - 2)); else skema = "INVALID"; .)
tilda.

/*-------------------------------------------------------------------------*/
@@ -110,27 +99,13 @@ skema_map<out SKEMAObject map> (. Dictionary<string, SKEMAObject> mapEl
rbrace
.

/*-------------------------------------------------------------------------*/
skon_map<out SKONObject map> (. Dictionary<string, SKONObject> mapElements; .)
= lbrace
open_skon_map<out mapElements> (. map = new SKONObject(mapElements); .)
rbrace
.

/*-------------------------------------------------------------------------*/
skema_array<out SKEMAObject array> (. SKEMAObject skemaObj; .)
= lbracket
skema_value<out skemaObj> (. array = SKEMAObject.ArrayOf(skemaObj); .)
rbracket
.

/*-------------------------------------------------------------------------*/
skon_array<out SKONObject array> (. List<SKONObject> arrayElements; .)
= lbracket
open_skon_array<out arrayElements> (. array = new SKONObject(arrayElements); .)
rbracket
.

/*-------------------------------------------------------------------------*/
open_skema_map<. out Dictionary<string, SKEMAObject> mapElements, out Dictionary<string, bool> optionalMap .> (. string key; SKEMAObject value; bool optional; mapElements = new Dictionary<string, SKEMAObject>(); optionalMap = new Dictionary<string, bool>(); .)
= {
@@ -142,14 +117,6 @@ open_skema_map<. out Dictionary<string, SKEMAObject> mapElements, out Dictionary
}
.

/*-------------------------------------------------------------------------*/
open_skon_map<. out Dictionary<string, SKONObject> mapElements .> (. string key; SKONObject value; mapElements = new Dictionary<string, SKONObject>(); .)
= {
skon_map_element <out key, out value> (. mapElements[key] = value; .)
WEAK comma
}
.

/*-------------------------------------------------------------------------*/
skema_map_element<out string key, out SKEMAObject obj, out bool optional> (. optional = false; .)
= [
@@ -160,13 +127,6 @@ skema_map_element<out string key, out SKEMAObject obj, out bool optional> (. opt
skema_value<out obj>
.

/*-------------------------------------------------------------------------*/
skon_map_element<out string key, out SKONObject obj>
= Ident<out key>
colon
skon_value<out obj>
.

/*-------------------------------------------------------------------------*/
definition<out string key, out SKEMAObject def>
= def Ident<out key>
@@ -178,28 +138,7 @@ definition<out string key, out SKEMAObject def>
Ident<out string name>
= ident (. name = t.val; .)
.

/*-------------------------------------------------------------------------*/
open_skon_array<. out List<SKONObject> arrayElements .> (. SKONObject skonObject; arrayElements = new List<SKONObject>(); .)
= {
skon_value<out skonObject> (. arrayElements.Add(skonObject); .)
WEAK comma
}
.

/*-------------------------------------------------------------------------*/
skon_value<out SKONObject skonObject> (. skonObject = null; .)
= string_ (. skonObject = new SKONObject(ParserUtils.EscapeString(t.val.Substring(1, t.val.Length - 2))); .)
| integer_ (. skonObject = new SKONObject(int.Parse(t.val)); .)
| double_ (. skonObject = new SKONObject(double.Parse(t.val, CultureInfo.InvariantCulture)); .)
| datetime_ (. skonObject = new SKONObject(ParseDatetime(t.val)); .)
| skon_map<out skonObject>
| skon_array<out skonObject>
| "true" (. skonObject = new SKONObject(true); .)
| "false" (. skonObject = new SKONObject(false); .)
| "null" (. skonObject = new SKONObject(); .)
.


/*-------------------------------------------------------------------------*/
type<out SKEMAObject skemaObj> (. skemaObj = null; .)
= "Any" (. skemaObj = SKEMAObject.Any; .)
19 changes: 7 additions & 12 deletions SKON.NET/GrammarProject/SKON.ATG
Original file line number Diff line number Diff line change
@@ -22,8 +22,6 @@ COMPILER SKON

private DateTime ParseDatetime(string value)
{
value = value.Substring(1);

DateTime dateTime;

if (DateTime.TryParseExact(value, dateTimeFormats, null, DateTimeStyles.None, out dateTime))
@@ -32,7 +30,8 @@ COMPILER SKON
}
else
{
return ParserUtils.UnixTimeStampToDateTime(long.Parse(value));
SynErr(13);
return default(DateTime);
}
}

@@ -49,6 +48,7 @@ CHARACTERS
escapech = "bnfrt/" + '\\' + '"'.
hex = "0123456789abcdefABCDEF".
dot = '.'.
identch = ANY - '{' - '}' - '[' - ']' - '"' - '.' - ','.

TOKENS
tilda = '~'.
@@ -58,22 +58,20 @@ TOKENS
rbrace = '}'.
lbracket = '['.
rbracket = ']'.
ident = letter { letter | digit }.
string_ = '"' { stringch | '\\' escapech | '\\' 'u' hex hex hex hex} '"'.
ident = identch { identch } ':'.
string_ = '"' { stringch | '\\' escapech } '"'.
badString = '"' { stringch | '\\' escapech } (cr | lf).
integer_ = ['-'] digit {digit}.
double_ = ['-'] digit {digit} (((dot digit {digit}) [('E' | 'e') [('+' | '-')] digit {digit}]) | (('E' | 'e') [('+' | '-')] digit {digit})).
datetime_ = '@' (digit {digit}
| digit digit digit digit '-' digit digit '-' digit digit
datetime_ = ( digit digit digit digit '-' digit digit '-' digit digit
| digit digit ':' digit digit ':' digit digit ('Z'|'z')
| digit digit ':' digit digit ':' digit digit '.' digit digit digit ('Z'|'z')
| digit digit ':' digit digit ':' digit digit ('+'|'-') digit digit ':' digit digit
| digit digit ':' digit digit ':' digit digit '.' {digit} ('+'|'-') digit digit ':' digit digit
| digit digit digit digit '-' digit digit '-' digit digit ('T' | 't') digit digit ':' digit digit ':' digit digit ('Z'|'z')
| digit digit digit digit '-' digit digit '-' digit digit ('T' | 't') digit digit ':' digit digit ':' digit digit '.' digit digit digit ('Z'|'z')
| digit digit digit digit '-' digit digit '-' digit digit ('T' | 't') digit digit ':' digit digit ':' digit digit ('+'|'-') digit digit ':' digit digit
| digit digit digit digit '-' digit digit '-' digit digit ('T' | 't') digit digit ':' digit digit ':' digit digit '.' digit digit digit ('+'|'-') digit digit ':' digit digit).

| digit digit digit digit '-' digit digit '-' digit digit ('T' | 't') digit digit ':' digit digit ':' digit digit '.' digit digit digit ('+'|'-') digit digit ':' digit digit ).

COMMENTS FROM "/*" TO "*/"
COMMENTS FROM "//" TO lf
@@ -89,7 +87,6 @@ SKON (. Dictionary<string, SKONObject> mapElements = new Dictionar
[
meta_SKEMA<out skema> (. metadata.SKEMA = skema; .)
]
SYNC
open_map<out mapElements> (. this.data = new SKONObject(mapElements); .)
.

@@ -139,7 +136,6 @@ open_map<. out Dictionary<string, SKONObject> mapElements .> (. string key; SKON
/*-------------------------------------------------------------------------*/
map_element<out string key, out SKONObject obj> (. string name; SKONObject skonObject; .)
= Ident<out name> (. key = name; .)
colon
value<out skonObject> (. obj = skonObject; .)
.

@@ -165,7 +161,6 @@ value<out SKONObject skonObject> (. skonObject = null; .)
| skon_array<out skonObject>
| "true" (. skonObject = new SKONObject(true); .)
| "false" (. skonObject = new SKONObject(false); .)
| "null" (. skonObject = new SKONObject(); .)
.

END SKON.
30 changes: 10 additions & 20 deletions SKON.NET/SKON.NET/Parser/Parser.cs
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ public class Parser {
public const int _integer_ = 11;
public const int _double_ = 12;
public const int _datetime_ = 13;
public const int maxT = 20;
public const int maxT = 19;

const bool _T = true;
const bool _x = false;
@@ -65,8 +65,6 @@ public class Parser {

private DateTime ParseDatetime(string value)
{
value = value.Substring(1);

DateTime dateTime;

if (DateTime.TryParseExact(value, dateTimeFormats, null, DateTimeStyles.None, out dateTime))
@@ -75,7 +73,8 @@ private DateTime ParseDatetime(string value)
}
else
{
return ParserUtils.UnixTimeStampToDateTime(long.Parse(value));
SynErr(13);
return default(DateTime);
}
}

@@ -150,7 +149,6 @@ void SKON() {
meta_SKEMA(out skema);
metadata.SKEMA = skema;
}
while (!(la.kind == 0 || la.kind == 8)) {SynErr(21); Get();}
open_map(out mapElements);
this.data = new SKONObject(mapElements);
}
@@ -220,7 +218,6 @@ void map_element(out string key, out SKONObject obj) {
string name; SKONObject skonObject;
Ident(out name);
key = name;
Expect(2);
value(out skonObject);
obj = skonObject;
}
@@ -271,12 +268,7 @@ void value(out SKONObject skonObject) {
skonObject = new SKONObject(false);
break;
}
case 19: {
Get();
skonObject = new SKONObject();
break;
}
default: SynErr(22); break;
default: SynErr(20); break;
}
}

@@ -292,10 +284,10 @@ public void Parse() {
}

static readonly bool[,] set = {
{_T,_x,_x,_x, _x,_x,_x,_x, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x},
{_T,_x,_x,_x, _x,_T,_x,_x, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x},
{_x,_x,_x,_x, _T,_x,_T,_x, _x,_T,_x,_T, _T,_T,_x,_x, _x,_T,_T,_T, _x,_x},
{_T,_x,_x,_x, _T,_x,_T,_T, _T,_T,_x,_T, _T,_T,_x,_x, _x,_T,_T,_T, _x,_x}
{_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x},
{_T,_x,_x,_x, _x,_T,_x,_x, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x},
{_x,_x,_x,_x, _T,_x,_T,_x, _x,_T,_x,_T, _T,_T,_x,_x, _x,_T,_T,_x, _x},
{_T,_x,_x,_x, _T,_x,_T,_T, _x,_T,_x,_T, _T,_T,_x,_x, _x,_T,_T,_x, _x}

};
} // end Parser
@@ -328,10 +320,8 @@ public virtual void SynErr (int line, int col, int n) {
case 16: s = "\"SKEMA\" expected"; break;
case 17: s = "\"true\" expected"; break;
case 18: s = "\"false\" expected"; break;
case 19: s = "\"null\" expected"; break;
case 20: s = "??? expected"; break;
case 21: s = "this symbol not expected in SKON"; break;
case 22: s = "invalid value"; break;
case 19: s = "??? expected"; break;
case 20: s = "invalid value"; break;

default: s = "error " + n; break;
}
632 changes: 461 additions & 171 deletions SKON.NET/SKON.NET/Parser/Scanner.cs

Large diffs are not rendered by default.

175 changes: 39 additions & 136 deletions SKON.NET/SKON.NET/SKEMA/Parser/Parser.cs
Original file line number Diff line number Diff line change
@@ -50,40 +50,12 @@ public class Parser {
public Token la; // lookahead token
int errDist = minErrDist;

public SKONObject metadata = new SKONObject();
public SKONMetadata metadata = new SKONMetadata();

public SKEMAObject data = SKEMAObject.Any;

public Dictionary<string, SKEMAObject> definitions = new Dictionary<string, SKEMAObject>();

private string[] dateTimeFormats = {
"yyyy-MM-dd",
"hh:mm:ssZ",
"hh:mm:ss.fffZ",
"hh:mm:sszzz",
"hh:mm:ss.fffzzz",
"yyyy-MM-ddThh:mm:ssZ",
"yyyy-MM-ddThh:mm:ss.fffZ",
"yyyy-MM-ddThh:mm:sszzz",
"yyyy-MM-ddThh:mm:ss.fffzzz"
};

private DateTime ParseDatetime(string value)
{
value = value.Substring(1);

DateTime dateTime;

if (DateTime.TryParseExact(value, dateTimeFormats, null, DateTimeStyles.None, out dateTime))
{
return dateTime;
}
else
{
return ParserUtils.UnixTimeStampToDateTime(long.Parse(value));
}
}

/*-------------------------------------------------------------------------*/


@@ -148,18 +120,43 @@ void SKEMA() {
Dictionary<string, SKONObject> metadataElements = new Dictionary<string, SKONObject>();
Dictionary<string, SKEMAObject> mapElements;
Dictionary<string, bool> optionalMap;
string key; SKONObject value;
while (la.kind == 1) {
meta_data(out key, out value);
int version; string docVersion; string skema;
meta_version(out version);
metadata.LanguageVersion = version;
meta_docVersion(out docVersion);
metadata.DocuemntVersion = docVersion;
if (la.kind == 1) {
meta_SKEMA(out skema);
metadata.SKEMA = skema;
}
this.metadata = new SKONObject(metadataElements);
open_skema_map(out mapElements, out optionalMap);
this.data = new SKEMAObject(mapElements, optionalMap);
}

void meta_data(out string key, out SKONObject obj) {
void meta_version(out int ver) {
Expect(1);
Expect(17);
Expect(2);
Expect(11);
if (int.TryParse(t.val, out ver) == false) ver = -1;
Expect(1);
}

void meta_docVersion(out string ver) {
Expect(1);
Expect(18);
Expect(2);
Expect(9);
if (t.val.Length > 2) ver = ParserUtils.EscapeString(t.val.Substring(1, t.val.Length - 2)); else ver = "INVALID";
Expect(1);
}

void meta_SKEMA(out string skema) {
Expect(1);
skon_map_element(out key, out obj);
Expect(19);
Expect(2);
Expect(9);
if (t.val.Length > 2) skema = ParserUtils.EscapeString(t.val.Substring(1, t.val.Length - 2)); else skema = "INVALID";
Expect(1);
}

@@ -177,12 +174,6 @@ void open_skema_map(out Dictionary<string, SKEMAObject> mapElements, out Diction
}
}

void skon_map_element(out string key, out SKONObject obj) {
Ident(out key);
Expect(2);
skon_value(out obj);
}

void skema_map(out SKEMAObject map) {
Dictionary<string, SKEMAObject> mapElements; Dictionary<string, bool> optionalMap;
Expect(4);
@@ -191,23 +182,6 @@ void skema_map(out SKEMAObject map) {
Expect(5);
}

void skon_map(out SKONObject map) {
Dictionary<string, SKONObject> mapElements;
Expect(4);
open_skon_map(out mapElements);
map = new SKONObject(mapElements);
Expect(5);
}

void open_skon_map(out Dictionary<string, SKONObject> mapElements ) {
string key; SKONObject value; mapElements = new Dictionary<string, SKONObject>();
while (la.kind == 8) {
skon_map_element(out key, out value);
mapElements[key] = value;
ExpectWeak(3, 2);
}
}

void skema_array(out SKEMAObject array) {
SKEMAObject skemaObj;
Expect(6);
@@ -218,7 +192,7 @@ void skema_array(out SKEMAObject array) {

void skema_value(out SKEMAObject skemaObj) {
skemaObj = null;
if (StartOf(3)) {
if (StartOf(2)) {
type(out skemaObj);
} else if (la.kind == 4) {
skema_map(out skemaObj);
@@ -230,23 +204,6 @@ void skema_value(out SKEMAObject skemaObj) {
} else SynErr(27);
}

void skon_array(out SKONObject array) {
List<SKONObject> arrayElements;
Expect(6);
open_skon_array(out arrayElements);
array = new SKONObject(arrayElements);
Expect(7);
}

void open_skon_array(out List<SKONObject> arrayElements ) {
SKONObject skonObject; arrayElements = new List<SKONObject>();
while (StartOf(4)) {
skon_value(out skonObject);
arrayElements.Add(skonObject);
ExpectWeak(3, 5);
}
}

void skema_map_element(out string key, out SKEMAObject obj, out bool optional) {
optional = false;
if (la.kind == 16) {
@@ -270,56 +227,6 @@ void Ident(out string name) {
name = t.val;
}

void skon_value(out SKONObject skonObject) {
skonObject = null;
switch (la.kind) {
case 9: {
Get();
skonObject = new SKONObject(ParserUtils.EscapeString(t.val.Substring(1, t.val.Length - 2)));
break;
}
case 11: {
Get();
skonObject = new SKONObject(int.Parse(t.val));
break;
}
case 12: {
Get();
skonObject = new SKONObject(double.Parse(t.val, CultureInfo.InvariantCulture));
break;
}
case 13: {
Get();
skonObject = new SKONObject(ParseDatetime(t.val));
break;
}
case 4: {
skon_map(out skonObject);
break;
}
case 6: {
skon_array(out skonObject);
break;
}
case 17: {
Get();
skonObject = new SKONObject(true);
break;
}
case 18: {
Get();
skonObject = new SKONObject(false);
break;
}
case 19: {
Get();
skonObject = new SKONObject();
break;
}
default: SynErr(28); break;
}
}

void type(out SKEMAObject skemaObj) {
skemaObj = null;
switch (la.kind) {
@@ -353,7 +260,7 @@ void type(out SKEMAObject skemaObj) {
skemaObj = SKEMAObject.DateTime;
break;
}
default: SynErr(29); break;
default: SynErr(28); break;
}
}

@@ -371,10 +278,7 @@ public void Parse() {
static readonly bool[,] set = {
{_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x},
{_T,_x,_x,_x, _x,_T,_x,_x, _T,_x,_x,_x, _x,_x,_x,_T, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x},
{_T,_x,_x,_x, _x,_T,_x,_x, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x},
{_x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _T,_T,_T,_T, _T,_T,_x,_x},
{_x,_x,_x,_x, _T,_x,_T,_x, _x,_T,_x,_T, _T,_T,_x,_x, _x,_T,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x},
{_T,_x,_x,_x, _T,_x,_T,_T, _x,_T,_x,_T, _T,_T,_x,_x, _x,_T,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x}
{_x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _T,_T,_T,_T, _T,_T,_x,_x}

};
} // end Parser
@@ -405,9 +309,9 @@ public virtual void SynErr (int line, int col, int n) {
case 14: s = "ref expected"; break;
case 15: s = "def expected"; break;
case 16: s = "opt expected"; break;
case 17: s = "\"true\" expected"; break;
case 18: s = "\"false\" expected"; break;
case 19: s = "\"null\" expected"; break;
case 17: s = "\"Version\" expected"; break;
case 18: s = "\"DocumentVersion\" expected"; break;
case 19: s = "\"SKEMA\" expected"; break;
case 20: s = "\"Any\" expected"; break;
case 21: s = "\"String\" expected"; break;
case 22: s = "\"Integer\" expected"; break;
@@ -416,8 +320,7 @@ public virtual void SynErr (int line, int col, int n) {
case 25: s = "\"DateTime\" expected"; break;
case 26: s = "??? expected"; break;
case 27: s = "invalid skema_value"; break;
case 28: s = "invalid skon_value"; break;
case 29: s = "invalid type"; break;
case 28: s = "invalid type"; break;

default: s = "error " + n; break;
}
485 changes: 272 additions & 213 deletions SKON.NET/SKON.NET/SKEMA/Parser/Scanner.cs

Large diffs are not rendered by default.

0 comments on commit d6e39f8

Please sign in to comment.