diff --git a/brag/brag/rules/lexer.rkt b/brag/brag/rules/lexer.rkt index 948c358..8665142 100755 --- a/brag/brag/rules/lexer.rkt +++ b/brag/brag/rules/lexer.rkt @@ -30,6 +30,7 @@ ) (define-lex-abbrev id (:& (complement (:+ digit)) (:+ id-char))) +(define-lex-abbrev id-separator (:or ":" "::=")) (define lex/1 (lexer-src-pos @@ -76,11 +77,11 @@ (return-without-pos (lex/1 input-port))] [(eof) (token-EOF lexeme)] - [(:: id (:* whitespace) ":") + [(:: id (:* whitespace) id-separator) (token-RULE_HEAD lexeme)] - [(:: hide-char id (:* whitespace) ":") + [(:: hide-char id (:* whitespace) id-separator) (token-RULE_HEAD_HIDDEN lexeme)] - [(:: splice-char id (:* whitespace) ":") + [(:: splice-char id (:* whitespace) id-separator) (token-RULE_HEAD_SPLICED lexeme)] [id (token-ID lexeme)] diff --git a/brag/brag/rules/parser.rkt b/brag/brag/rules/parser.rkt index 4cf9608..a5ea573 100755 --- a/brag/brag/rules/parser.rkt +++ b/brag/brag/rules/parser.rkt @@ -59,6 +59,8 @@ (define hide-char #\/) (define splice-char #\@) +(define id-separators-pattern "((:)|(::=))") + ;; grammar-parser: (-> token) -> (listof rule) (define grammar-parser (parser @@ -84,7 +86,7 @@ [rule [(RULE_HEAD pattern) (begin - (define trimmed (regexp-replace #px"\\s*:$" $1 "")) + (define trimmed (regexp-replace (pregexp (format "\\s*~a$" id-separators-pattern)) $1 "")) (rule (position->pos $1-start-pos) (position->pos $2-end-pos) (lhs-id (position->pos $1-start-pos) @@ -98,7 +100,7 @@ [(RULE_HEAD_HIDDEN pattern) ; slash indicates hiding (begin - (define trimmed (cadr (regexp-match (pregexp (format "~a(\\S+)\\s*:$" hide-char)) $1))) + (define trimmed (cadr (regexp-match (pregexp (format "~a(\\S+)\\s*~a$" hide-char id-separators-pattern)) $1))) (rule (position->pos $1-start-pos) (position->pos $2-end-pos) (lhs-id (position->pos $1-start-pos) @@ -113,7 +115,7 @@ [(RULE_HEAD_SPLICED pattern) ; atsign indicates splicing (begin - (define trimmed (cadr (regexp-match (pregexp (format "~a(\\S+)\\s*:$" splice-char)) $1))) + (define trimmed (cadr (regexp-match (pregexp (format "~a(\\S+)\\s*~a$" splice-char id-separators-pattern)) $1))) (rule (position->pos $1-start-pos) (position->pos $2-end-pos) (lhs-id (position->pos $1-start-pos)