私のlexer.mll
中で私は次のように宣言しEOS
ました:
let line_feed = '\n' (* %x200A *)
let carriage_return = '\r' (* %x200D *)
let line_terminator = line_feed | carriage_return | carriage_return line_feed
(* KO: %x2028 | %x2029 *)
let LINE_END = line_terminator
let tab_character = '\x09' (* CHARACTER TABULATION *)
let eom_character = '\x19' (* END OF MEDIUM *)
let space_character = '\x20' (* SPACE *)
let underscore = '\x5F' (* LOW LINE or SPACING UNDERSCORE *)
let WSC = tab_character | eom_character | space_character
let line_continuation = WSC* underscore WSC* line_terminator
let WS = (WSC | line_continuation)+
let EOL = WS? LINE_END
let EOS = EOL*
rule token = parse
| WS { token lexbuf }
| LINE_END { newline lexbuf; token lexbuf }
| EOS { EOS }
私parser.mly
の には、次のようなものがあります。
%token EOS
...
%%
nonterminal :
statement EOS
statement { semantic-action }
test_KO.txt
以下のように編集すると、Emacs
解析中にエラーが発生します。
a_statement
b_statement
space
ただし、次のように 1 つ追加するa_statement
と、解析に合格します。
a_statement(space)
b_statement
line_terminator
理由は とが認識できないためだと思いtest_KO.txt
ますが、a_statemnt
とb_statement
は同じ行にありません。line_terminator
それらの間に1つあれば認識できspace
ます。
x2028とx2029を追加line_terminator
すると問題が解決すると思いますか? ocamllex
おそらくユニコードを十分にサポートしていないため、テストするのは複雑です...
それ以外の場合、問題に対する他の解決策はありますか?