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
  • Loading branch information
NogginBops authored Feb 14, 2017
2 parents 779f72f + c32855b commit d6e39f8
Show file tree
Hide file tree
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
Expand Up @@ -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_".
Expand Down Expand Up @@ -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
Expand All @@ -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.

/*-------------------------------------------------------------------------*/
Expand All @@ -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>(); .)
= {
Expand All @@ -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; .)
= [
Expand All @@ -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>
Expand All @@ -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; .)
Expand Down
19 changes: 7 additions & 12 deletions SKON.NET/GrammarProject/SKON.ATG
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -32,7 +30,8 @@ COMPILER SKON
}
else
{
return ParserUtils.UnixTimeStampToDateTime(long.Parse(value));
SynErr(13);
return default(DateTime);
}
}

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

TOKENS
tilda = '~'.
Expand All @@ -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
Expand All @@ -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); .)
.

Expand Down Expand Up @@ -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; .)
.

Expand All @@ -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
Expand Up @@ -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;
Expand Down Expand Up @@ -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))
Expand All @@ -75,7 +73,8 @@ private DateTime ParseDatetime(string value)
}
else
{
return ParserUtils.UnixTimeStampToDateTime(long.Parse(value));
SynErr(13);
return default(DateTime);
}
}

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
}

Expand All @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down
Loading

0 comments on commit d6e39f8

Please sign in to comment.