From ccc5b814ed07ff8d0f83b36ba540ba12c0a90700 Mon Sep 17 00:00:00 2001 From: Marcelo Cantos Date: Sat, 8 Aug 2020 22:16:54 +1000 Subject: [PATCH] Tidier IDENT syntax (#86) --- README.md | 2 +- examples/wbnf.wbnf | 2 +- parser/scope.go | 3 ++- wbnf/wbnfgrammar.go | 26 +++++++++++++------------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 75e9ad6..f50984b 100644 --- a/README.md +++ b/README.md @@ -314,7 +314,7 @@ REF -> "%" IDENT ("=" default=STR)?; COMMENT -> /{ //.*$ | (?s: /\* (?: [^*] | \*+[^*/] ) \*/ ) }; -IDENT -> /{@|[A-Za-z_\.]\w*}; +IDENT -> /{@|\.?[A-Za-z_]\w*}; INT -> \d+; STR -> /{ " (?: \\. | [^\\"] )* " | ' (?: \\. | [^\\'] )* ' diff --git a/examples/wbnf.wbnf b/examples/wbnf.wbnf index 7929a07..e958f77 100644 --- a/examples/wbnf.wbnf +++ b/examples/wbnf.wbnf @@ -19,7 +19,7 @@ REF -> "%" IDENT ("=" default=STR)?; COMMENT -> /{ //.*$ | (?s: /\* (?: [^*] | \*+[^*/] ) \*/ ) }; -IDENT -> /{@|[A-Za-z_\.]\w*}; +IDENT -> /{@|\.?[A-Za-z_]\w*}; INT -> \d+; STR -> /{ " (?: \\. | [^\\"] )* " | ' (?: \\. | [^\\'] )* ' diff --git a/parser/scope.go b/parser/scope.go index 22e6fa2..c4807dc 100644 --- a/parser/scope.go +++ b/parser/scope.go @@ -67,7 +67,8 @@ func (s Scope) ReplaceCutPoint(force bool) (newScope Scope, prev, replacement Cu prev = s.GetCutPoint() replacement = invalidCutpoint if prev.valid() || force { - replacement = Cutpointdata(rand.Int31()) + // TODO: What's with the random number? + replacement = Cutpointdata(rand.Int31()) //nolint:gosec return s.With(cutpointkey, replacement), prev, replacement } return s, invalidCutpoint, invalidCutpoint diff --git a/wbnf/wbnfgrammar.go b/wbnf/wbnfgrammar.go index 7a82f86..a3f96ac 100644 --- a/wbnf/wbnfgrammar.go +++ b/wbnf/wbnfgrammar.go @@ -10,10 +10,10 @@ import ( func Grammar() parser.Parsers { return parser.Grammar{".wrapRE": parser.RE(`\s*()\s*`), "COMMENT": parser.RE(`//.*$|(?s:/\*(?:[^*]|\*+[^*/])\*/)`), - "IDENT": parser.RE(`@|[A-Za-z_\.]\w*`), + "IDENT": parser.RE(`@|\.?[A-Za-z_]\w*`), "INT": parser.RE(`\d+`), "RE": parser.RE(`/{(?:\\.|{(?:(?:\d+(?:,\d*)?|,\d+)\})?|\[(?:\\.|\[:^?[a-z]+:\]|[^\]])+]|[^\\{\}])*\}|(?:(?:\[(?:\\.|\[:^?[a-z]+:\]|[^\]])+]|\\[pP](?:[a-z]|\{[a-zA-Z_]+\})|\\[a-zA-Z]|[.^$])(?:(?:[+*?]|\{\d+,?\d?\})\??)?)+`), - "REF": parser.Seq{parser.CutPoint{Term: parser.S(`%`)}, + "REF": parser.Seq{parser.CutPoint{parser.S(`%`)}, parser.Rule(`IDENT`), parser.Opt(parser.Seq{parser.S(`=`), parser.Eq(`default`, @@ -24,7 +24,7 @@ func Grammar() parser.Parsers { parser.Rule(`RE`), parser.Rule(`macrocall`), parser.Eq(`ExtRef`, - parser.Seq{parser.CutPoint{Term: parser.S(`%%`)}, + parser.Seq{parser.CutPoint{parser.S(`%%`)}, parser.Rule(`IDENT`)}), parser.Rule(`REF`), parser.Seq{parser.S(`(`), @@ -33,7 +33,7 @@ func Grammar() parser.Parsers { parser.Seq{parser.S(`(`), parser.S(`)`)}}, "grammar": parser.Some(parser.Rule(`stmt`)), - "macrocall": parser.Seq{parser.CutPoint{Term: parser.S(`%!`)}, + "macrocall": parser.Seq{parser.CutPoint{parser.S(`%!`)}, parser.Eq(`name`, parser.Rule(`IDENT`)), parser.S(`(`), @@ -47,15 +47,15 @@ func Grammar() parser.Parsers { "pragma": parser.ScopedGrammar{Term: parser.Oneof{parser.Rule(`import`), parser.Rule(`macrodef`)}, Grammar: parser.Grammar{".wrapRE": parser.RE(`\s*()\s*`), - "import": parser.Seq{parser.CutPoint{Term: parser.S(`.import`)}, + "import": parser.Seq{parser.CutPoint{parser.S(`.import`)}, parser.Eq(`path`, - parser.Delim{Term: parser.Oneof{parser.CutPoint{Term: parser.S(`..`)}, - parser.CutPoint{Term: parser.S(`.`)}, + parser.Delim{Term: parser.Oneof{parser.CutPoint{parser.S(`..`)}, + parser.CutPoint{parser.S(`.`)}, parser.RE(`[a-zA-Z0-9.:]+`)}, Sep: parser.S(`/`), CanStartWithSep: true}), - parser.Opt(parser.CutPoint{Term: parser.S(`;`)})}, - "macrodef": parser.Seq{parser.CutPoint{Term: parser.S(`.macro`)}, + parser.Opt(parser.CutPoint{parser.S(`;`)})}, + "macrodef": parser.Seq{parser.CutPoint{parser.S(`.macro`)}, parser.Eq(`name`, parser.Rule(`IDENT`)), parser.S(`(`), @@ -66,11 +66,11 @@ func Grammar() parser.Parsers { parser.S(`{`), parser.Rule(`term`), parser.S(`}`), - parser.Opt(parser.CutPoint{Term: parser.S(`;`)})}}}, + parser.Opt(parser.CutPoint{parser.S(`;`)})}}}, "prod": parser.Seq{parser.Rule(`IDENT`), - parser.CutPoint{Term: parser.S(`->`)}, + parser.CutPoint{parser.S(`->`)}, parser.Some(parser.Rule(`term`)), - parser.CutPoint{Term: parser.S(`;`)}}, + parser.CutPoint{parser.S(`;`)}}, "quant": parser.Oneof{parser.Eq(`op`, parser.RE(`[?*+]`)), parser.Seq{parser.S(`{`), @@ -1460,7 +1460,7 @@ REF -> "%" IDENT ("=" default=STR)?; COMMENT -> /{ //.*$ | (?s: /\* (?: [^*] | \*+[^*/] ) \*/ ) }; -IDENT -> /{@|[A-Za-z_\.]\w*}; +IDENT -> /{@|\.?[A-Za-z_]\w*}; INT -> \d+; STR -> /{ " (?: \\. | [^\\"] )* " | ' (?: \\. | [^\\'] )* '