BYacc中的空格和行

时间:2014-05-15 23:29:48

标签: parsing yacc

嗨伙计们。

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

1

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

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

2

whitespace: WHITESPACE {$$ = " ";}
            | whitespace WHITESPACE {$$ = $1 + " ";}

where:
WHITESPACE = [ \t]        in Jflex

他们是对的吗?谢谢所有

1 个答案:

答案 0 :(得分:1)

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

其中:

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

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

NEW_LINE = (\r\n|\n|\r)+ return NEW_LINE;

而不是解析器:

line : NEW_LINE { $$ = System.lineSeparator(); }

空格通常包括行终止符,除非它们在你的语法中是重要的,它们似乎是,但也是表格提要:

WHITESPACE  [ \t\f]

再次在词法分析器而不是解析器中收集所有内容会更有效:

WHITESPACE  [ \t\f]+

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

请注意,每当它再次显示为free() $1,等时,必须为$2, - d,并且不会直接复制到$$.

但是通常空格根本没有出现在语法中,它只是被词法分子忽略了:

WHITESPACE  [ \t\f]+ ;

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