The following URI in ODIN is not recognized as an URI by the lexer:
http://www.test.example
http://www.test.example/
They are however both valid URIs.
The lexer does not recognize this because of the following lexer rules:
URI : URI_SCHEME SYM_COLON URI_HIER_PART ( '?' URI_QUERY )? ;
fragment URI_HIER_PART : ( '//' URI_AUTHORITY )? URI_PATH ;
fragment URI_PATH : ( '/' URI_XPALPHA+ )+ ;
On first glance it looks like this can be fixed with a simple URI_PATH?. However, this clashes with the labels of the expression grammar.
So I tried:
fragment URI_HIER_PART : ( '//' URI_AUTHORITY ) | URI_PATH | ( '//' URI_AUTHORITY ) URI_PATH ;
Which is better, but it still clashes with the following rule statement:
label:/path/to/value + /other_path = 3
because it matches label:/path/to/value as an URI.
So the remaining fixes are:
-
Require the URI_AUTHORITY: fragment URI_HIER_PART : ( '//' URI_AUTHORITY ) URI_PATH? ;
-
Match the <>-characters that must always surround a URL in the lexer
-
Find a way to implement different lexer modes for different parts of the archetype
-
would be best I think. however, there is no easy way in the current ADL language design to implement lexer mode switching without resorting to rather complicated target language constructions. So I stuck with the first solution for now for archie, which is at least better than the alternatives. A better fix would be good though!
The following URI in ODIN is not recognized as an URI by the lexer:
They are however both valid URIs.
The lexer does not recognize this because of the following lexer rules:
On first glance it looks like this can be fixed with a simple
URI_PATH?. However, this clashes with the labels of the expression grammar.So I tried:
Which is better, but it still clashes with the following rule statement:
because it matches
label:/path/to/valueas an URI.So the remaining fixes are:
Require the URI_AUTHORITY:
fragment URI_HIER_PART : ( '//' URI_AUTHORITY ) URI_PATH? ;Match the
<>-characters that must always surround a URL in the lexerFind a way to implement different lexer modes for different parts of the archetype
would be best I think. however, there is no easy way in the current ADL language design to implement lexer mode switching without resorting to rather complicated target language constructions. So I stuck with the first solution for now for archie, which is at least better than the alternatives. A better fix would be good though!