[Ur] Proposed location literals to track caller's location in error msgs.

Adam Chlipala adamc at csail.mit.edu
Thu May 28 08:29:56 EDT 2015


Why not just implement this functionality purely in the lexer, lexing 
the special marker as a string literal with the right contents?  You can 
call [ErrorMsg.spanOf] directly in the lexer, rather than via its alias 
[s] in the parser.

(I'm agnostic on exactly which token gets this treatment.)

On 05/26/2015 09:41 AM, Gabriel Riba wrote:
> The simplest way to add the caller's location is to have a location 
> literal, in the spirit of PHP's __LINE__, and pass it as a string 
> parameter.
>
> I am going to use the mlyacc error span meccanism and name the literal 
> _LOC_ (LOC surrounded by a single underscore).
>
> Addtion to "urweb.lex":
>
> <INITIAL> "_LOC_" => (Tokens.LOCATION (pos yypos, pos yypos + size 
> yytext));
>
>
> Addition to "urweb.grm":
>
> * In the terminals %term clause add
>
>  | LOCATION
>
> * In the "eterm" production clause add
>
>        | LOCATION    (let
>                         val strLoc = ErrorMsg.spanToString (s 
> (LOCATIONleft, LOCATIONright))
>                      in
>                         (EPrim (Prim.String (Prim.Normal, strLoc)), s 
> (LOCATIONleft, LOCATIONright))
>                      end)



More information about the Ur mailing list