2013-05-27 25 views
-1

這是我的輸入文件:野牛柔性新行沒有被識別

class Box{ 
integer x; 
} 

的解析識別標記CLASS,標識,{,然後它說下一個標記$未定義,然後它打印語法錯誤

當代碼是這樣一行:

class Box{integer x;} 

它按預期工作...

所以,主要的問題是如何識別新線

編輯:這裏是Flex文件

declarations 
%% 
"\n" {return (NEWLINE); } 
[ ]+ /* blank, tab, new line: eat up whitespace */ 
. {return(yytext[0]);} 
%% 
Auxiliary functions 

我是否需要改變我的空白,標籤的一部分和新的行代碼:?

[ \t\n]+   /* blank, tab, new line: eat up whitespace */ 
.     {return(yytext[0]);} 

EDIT2:我的Flex文件是:

flex 
%{ 
#include "arxeio.tab.h" 
%} 
KEF [A-Z] 
MIK [a-z] 
NUM [0-9] 
US [_] 
ID [A-Z]([A-Z]*[a-z]*[0-9]*[_]*)*|[a-z]([A-Z]*[a-z]*[0-9]*[_]*)*|[_]([A-Z]*[a-z]*[0-9]*[_]*)* 
AR [0-9]+ 
%% 
":=" {return (ASSGNOP); } 
char {return (CHAR); } 
else { return (ELSE); } 
if {return (IF); } 
integer {return (INTEGER); } 
class {return (CLASS); } 
new {return (NEW); } 
return {return (RETURN); } 
void {return (VOID); } 
while {return (WHILE); } 
{ID} {return(IDENTIFIER) ;} 
{AR} {return (NUMBER); } 
"\n" { fputs("<<newline>>\n", stderr); return (NEWLINE); } 
"\"" {return (ET); } 
"\'" {return (ET); } 
"\0" {return (ET); } 
"\t" {return (ET); } 
"\\" {return (ET); } 
[ \t\n]+ /* ignore spaces, tabulations,line breaks,blank, tab, new line: eat up whitespace*/ 
.     {return(yytext[0]);} 
%% 

我野牛文件是:

%{ 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <math.h> 
    #define YYDEBUG 1 
    int yylex(void) ; 
    extern FILE *yyout; 
    int errors; 
    %} 
    %start program 
    %token CHAR ELSE IF INTEGER CLASS NEW RETURN VOID WHILE ASSGNOP 
    %token NUMBER NEWLINE 
    %token IDENTIFIER 
    %token KEF MIK NUM ET 
    %left '`''~''@''#''$''^''['']''{''}'',''_''?''.'';'':' 
    %left '|''&''!' 
    %left '>''<''=' 
    %left '-''+' 
    %left '*''/''%' 
    %left '('')' 
    %expect 32 
    %% 
    ... 
    ... 
    ... 
    program : CLASS IDENTIFIER '{'NEWLINE declar'}' 
    ; 

    %% 

    main (int argc,char *argv[]) 
    {extern FILE *yyin; 
    ++argv;--argc; 
    yyin = fopen (argv[0],"r"); 
    yydebug = 1; 
    errors = 0; 
    yyparse(); 
    } 

    yyerror(char *errmsg) 
    { 
    fprintf(stderr, "%s\n",errmsg); 
    } 
+0

通常情況下,你的詞彙掃描儀將「跳過」換行,對待他們他們一樣的空白,除了增加輸入行計數器。當然,您可能會反對它們出現在字符串或字符常量內,並且它們會標記單行註釋的結尾,但所有這些都是在詞法掃描程序內部處理的。由於您未展示任何Flex代碼,因此我們無法多說。 –

+0

@JonathanLeffler我已經更新了這個問題 – fxuser

+0

請注意,'「/ n」'與*「非常不同'」\ n「'。 –

回答

0

假設Flex代碼是copy'n'pasted,你」我有一個簡單的錯字:

"/n" {return (NEWLINE); } 

應該是:

"\n" { return(NEWLINE); } 

你可以幫助自己使用(臨時)調試此:

"\n" { fputs("<<newline>>\n", stderr); return (NEWLINE); } 

,然後觀察,它永遠不會執行它。

+0

當我複製粘貼代碼時,它必須是一個問題..代碼如您所說,因此在那裏沒有任何問題 – fxuser

+0

當詞法掃描程序返回NEWLINE標記時,您的語法做什麼? NEWLINE是該語言中的公認標誌嗎? –

+0

我的語法中包括NEWLINE - >'%token NEWLINE',並且是NEWLINE被認爲是標記 - 您能解釋一下您的第一個問題嗎? – fxuser

0

既然你有這條規則:"/n" {return (NEWLINE); },你顯然需要在你的文法中指定NEWLINE跟在{之後;我想你沒有,哪一個是可以理解的。

因此,你需要使用這些規則

[ \t\n]+ /* ignore spaces, tabulations and line breaks */ 
.  {return(yytext[0]);} 
+0

我首先是這個 'program:CLASS IDENTIFIER' {'declar ....' 和我改 '程序:類標識符 '{' NEWLINE declar ....' 仍然解析器後,同樣的錯誤認識''{象徵,它拋出'下一個令牌是$ undefined',然後它停止' – fxuser

+0

是否檢測到換行符?在'return('NEWLINE')之前放置'puts'會發生什麼;'? –

+0

問題仍然存在..我附上我的野牛和flex代碼上面 – fxuser