1

現在、私は Ocaml でインタプリタを書こうとしていますが、これは私の lexer.mll です:

{

    open Parser
    exception Eof
}


rule main = parse
      [ ' ' '\t' ]  { main lexbuf } 
    | [ '\n' ]  { EOL } 
    | ['0'-'9']+ as lxm { LINE_NUMBER(int_of_string lxm) }
    | [^\\]*\.(\w+)$  as lxm { FILE_NAME lxm }
    | "get_line"    { GET_LINE }    
    (*| [ ^-?\b([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])\b ]     { RANGE }   (* -2055 < RANGE < 2055 *)*)
    | eof   { raise Eof }

なぜ ocamllex が { FILE_NAME lxm } 行でエラーを表示するのか、私は本当に混乱しています。レクサーの先頭に置く#load "str.cma"と、その行にエラー構文エラーが出力されます。

なんで?私はかなり混乱しています...

編集

する必要があります[ [^\\]*\.(\w+)$ ] as lxm { FILE_NAME lxm }

しかし、問題はまだ解決されていません...

4

1 に答える 1

2

認識されない正規表現の多くの部分があります。

  • \\: 「\」文字に一致するように一重引用符で囲みます。
  • \.: ドットを一重引用符で囲んでドットに一致させます。
  • \w: ocamllex はこのエスケープされたシーケンスを認識していないようです。自分で定義する必要があります。
  • $: 行末を定義します。

まず、これを字句解析ルールの前に置きます。

let w = ['a'-'z' 'A'-'Z' '0'-'9' '_']
let eol = '\n' | "\r\n"

次に、ルールを次のように変更します

[^'\\' '\n']*'.'w+eol

一致した式 ( lxm) には行末シーケンス ( '\n' または"\r\n") が含まれるため、それを削除する必要があります。

また、文字列を行末まで一致させようとするときは注意してください。デフォルトの動作は最も長い文字列に一致するため、正規表現が行末を受け入れる場合、一度に複数の行に一致する可能性があります。そのため、'\n' を禁止しています。

于 2014-03-19T16:00:20.640 に答える