首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BYacc中的空格和行

BYacc中的空格和行
EN

Stack Overflow用户
提问于 2014-05-16 07:29:48
回答 1查看 44关注 0票数 0

你们好啊。

您如何看待这两条规则来解析空格和识别我必须翻译的文件的不同行?

1.

代码语言:javascript
运行
复制
line: NEW_LINE {$$ = System.lineSeparator();}
      | line NEW_LINE {$$ = $1 + System.lineSeparator();}

where:
NEW_LINE = \r\n|\n|\r   in Jflex

2.

代码语言:javascript
运行
复制
whitespace: WHITESPACE {$$ = " ";}
            | whitespace WHITESPACE {$$ = $1 + " ";}

where:
WHITESPACE = [ \t]        in Jflex

他们是正确的吗?感谢所有人

EN

回答 1

Stack Overflow用户

发布于 2014-05-16 08:52:43

代码语言:javascript
运行
复制
line: NEW_LINE {$$ = System.lineSeparator();}
    | line NEW_LINE {$$ = $1 + System.lineSeparator();}

,其中:

代码语言:javascript
运行
复制
NEW_LINE = \r\n|\n|\r   in Jflex

如果你真的不关心多个换行符,就像这个语法所暗示的那样,在词法分析器中收集它们:

代码语言:javascript
运行
复制
NEW_LINE = (\r\n|\n|\r)+ return NEW_LINE;

而不在解析器中:

代码语言:javascript
运行
复制
line : NEW_LINE { $$ = System.lineSeparator(); }

空格通常包括行终止符,除非它们在语法中很重要(看起来很重要),但也包括换行符:

代码语言:javascript
运行
复制
WHITESPACE  [ \t\f]

同样,在lexer中收集所有数据要比在解析器中收集要高效得多:

代码语言:javascript
运行
复制
WHITESPACE  [ \t\f]+

whitespace: WHITESPACE { $$ = strdup(yytext); }

请注意,无论何时以$1, $2,等形式重新出现,它都必须是free()-d,并且不能直接复制到$$.

但是通常空格根本不会出现在语法中,它只是被lexer忽略了:

代码语言:javascript
运行
复制
WHITESPACE  [ \t\f]+ ;

除非你真的在语法中真的需要它。这几乎是不可能的。您应该能够使用词法分析器返回给您的非空格标记。

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

https://stackoverflow.com/questions/23690360

复制
相关文章

相似问题

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