2014-05-15 37 views
0

Hy guys。空白和BYACC线

对于这两个规则来说,解析空格和识别我必须翻译的文件的不同行是什么?

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
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() -d时,它重现为$1,$2,等,而不是直接复制到$$.

但随后通常空白不会出现在语法可言,它只是词法分析器忽略:

WHITESPACE [ \t\f]+ ; 

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