Tôi đã sử dụng phiên bản ANTLR 4 để tạo trình biên dịch. Giai đoạn đầu tiên là phần Lexer. Tôi tạo ra "CompilerLexer.g4" tập tin và quy tắc lexer putted trong it.It hoạt động tốt.Sử dụng trình phân tích cú pháp ANTLR và Lexer tách biệt
CompilerLexer.g4:
lexer grammar CompilerLexer;
INT : 'int' ; //1
FLOAT : 'float' ; //2
BEGIN : 'begin' ; //3
END : 'end' ; //4
To : 'to' ; //5
NEXT : 'next' ; //6
REAL : 'real' ; //7
BOOLEAN : 'bool' ; //8
.
.
.
NOTEQUAL : '!=' ; //46
AND : '&&' ; //47
OR : '||' ; //48
POW : '^' ; //49
ID : [a-zA-Z]+ ; //50
WS
: ' ' -> channel(HIDDEN) //50
;
Bây giờ đó là thời gian cho giai đoạn 2 là parser.I tạo "CompilerParser.g4" tập tin và putted văn phạm trong đó nhưng có hàng chục cảnh báo và lỗi.
CompilerParser.g4:
parser grammar CompilerParser;
options { tokenVocab = CompilerLexer; }
STATEMENT : EXPRESSION SEMIC
| IFSTMT
| WHILESTMT
| FORSTMT
| READSTMT SEMIC
| WRITESTMT SEMIC
| VARDEF SEMIC
| BLOCK
;
BLOCK : BEGIN STATEMENTS END
;
STATEMENTS : STATEMENT STATEMENTS*
;
EXPRESSION : ID ASSIGN EXPRESSION
| BOOLEXP
;
RELEXP : MODEXP (GT | LT | EQUAL | NOTEQUAL | LE | GE | AND | OR) RELEXP
| MODEXP
;
.
.
.
VARDEF : (ID COMA)* ID COLON VARTYPE
;
VARTYPE : INT
| FLOAT
| CHAR
| STRING
;
compileUnit
: EOF
;
Cảnh báo và các lỗi:
- định nghĩa tiềm ẩn của token 'BLOCK' trong phân tích cú pháp
- định nghĩa tiềm ẩn của token ' BOOLEXP 'trong trình phân tích cú pháp
- định nghĩa tiềm ẩn của token 'EXP' trong phân tích cú pháp
- định nghĩa tiềm ẩn của token 'EXPLIST' trong phân tích cú pháp
- lexer quy tắc 'BLOCK' không được phép vào phân tích cú pháp
- lexer quy tắc 'EXP' không được phép vào phân tích cú pháp
quy tắc- lexer 'EXPLIST' không được phép vào phân tích cú pháp
- lexer quy tắc 'EXPRESSION' không được phép vào phân tích cú pháp
Có hàng chục các cảnh báo và lỗi. Nguyên nhân là gì?
Câu hỏi chung: Sự khác biệt giữa việc sử dụng ngữ pháp kết hợp và sử dụng lexer và phân tích cú pháp riêng biệt là gì? Làm thế nào nên tham gia các tập tin ngữ pháp và lexer riêng biệt?
Vấn đề chính được giải quyết. Làm thế nào về câu hỏi chung? – user2998131
@ user2998131, ah, đã bỏ qua chúng. Sẽ trả lời những người đó sau. –
@ user2998131, kiểm tra ** EDIT ** của tôi. –