在我lexer.mll
我宣布EOS
如下:的空间让line_terminator识别
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
不过,如果我a_statement
如下之后添加一个space
,它通过解析:
a_statement(space)
b_statement
我想原因是line_terminator
不能test_KO.txt
承认,虽然a_statemnt
和b_statement
不在同一直线上;如果它们之间有一个space
,则可以识别出line_terminator
。
您是否认为将x2028和x2029添加到line_terminator
会解决问题?由于ocamllex
可能不支持unicode,所以测试它会很复杂......
否则,有没有其他解决方案的问题?
您是否解决了问题?什么是a_statement和b_statement的解析规则?有很多可能性。 – didierc 2012-10-26 15:02:07