首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要一个空格才能让line_terminator被识别

需要一个空格才能让line_terminator被识别
EN

Stack Overflow用户
提问于 2012-08-04 13:55:28
回答 1查看 116关注 0票数 0

在我的lexer.mll中,我按如下方式声明了EOS

代码语言:javascript
复制
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中,我有这样的东西:

代码语言:javascript
复制
%token EOS
...
%%
nonterminal :
    statement EOS 
    statement { semantic-action }

我在Emacs下编辑我的test_KO.txt,如下所示,它在解析时引发错误:

代码语言:javascript
复制
a_statement
b_statement

但是,如果我在a_statement后面添加一个space,如下所示,它会通过解析:

代码语言:javascript
复制
a_statement(space)
b_statement

我猜是因为test_KO.txt不能识别line_terminator,尽管a_statemntb_statement不在同一行;如果它们之间有一个space,就可以识别line_terminator

你认为在line_terminator中添加x2028x2029会解决这个问题吗?由于ocamllex可能不支持unicode,所以测试它会很复杂……

否则,有没有其他的解决方案呢?

EN

回答 1

Stack Overflow用户

发布于 2013-04-21 20:31:17

问题是您的WS、LINE_END和EOS规则都可以尝试匹配相同的字符串,有关用于选择哪个正则表达式实际匹配的“最长匹配”规则,请参阅the OCamllex manual

当语句之间只有一个行终止符时,'LINE_END‘和'EOS’规则都只匹配1个字符,但'LINE_END‘规则出现得更早,因此它被选中。不会发出EOS令牌,并且您的语法会出现错误。

如果同时具有空格和行终止符,则“WS”的规则将匹配1个字符,而EOS的规则将匹配两个字符(空格和换行符),因此选择了EOS的规则。现在发出了一个EOS令牌,您的语法按预期工作。

最简单的方法可能是从词法分析器和语法中删除EOS标记。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11806323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档