Parsing BYacc中的空格和行

Parsing BYacc中的空格和行,parsing,yacc,Parsing,Yacc,嗨,伙计们 您如何看待这两条规则来解析空白和识别我必须翻译的文件的不同行 一, 二, 他们说得对吗?谢谢大家 line: NEW_LINE {$$ = System.lineSeparator();} | line NEW_LINE {$$ = $1 + System.lineSeparator();} 其中: 如果你真的不在乎多行新词,正如语法所建议的,把它们都收集到lexer中: NEW_LINE = (\r\n|\n|\r)+ return NEW_LINE; WHITESPA

嗨,伙计们

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

一,

二,

他们说得对吗?谢谢大家

line: NEW_LINE {$$ = System.lineSeparator();}
    | line NEW_LINE {$$ = $1 + System.lineSeparator();}
其中:

如果你真的不在乎多行新词,正如语法所建议的,把它们都收集到lexer中:

NEW_LINE = (\r\n|\n|\r)+ return NEW_LINE;
WHITESPACE  [ \t\f]+ ;
而不是在解析器中:

line : NEW_LINE { $$ = System.lineSeparator(); }
WHITESPACE  [ \t\f]+

whitespace: WHITESPACE { $$ = strdup(yytext); }
空白通常包括行结束符,除非它们在语法中很重要(看起来很重要),但也包括FormFeed:

WHITESPACE  [ \t\f]
同样,在lexer中收集所有信息要比在解析器中收集有效得多:

line : NEW_LINE { $$ = System.lineSeparator(); }
WHITESPACE  [ \t\f]+

whitespace: WHITESPACE { $$ = strdup(yytext); }
请注意,每当它以
$1、
$2、
等形式重新出现时,它必须是
free()
-d,并且不能直接复制到
$$。

但通常情况下,空白根本不会出现在语法中,只是被词法分析器忽略了:

NEW_LINE = (\r\n|\n|\r)+ return NEW_LINE;
WHITESPACE  [ \t\f]+ ;
除非你在语法上真的需要它。这不太可能。您应该能够使用lexer返回给您的非空白标记