我试图创建一个解析器,它将英语句子翻译成画布上的绘制形状。例如:“创建一个红色框”应该在画布上创建一个红色框。
我从您的 wiki 上的教程中提出了这个语法文件。不知道是否正确,如果有人可以检查它会很好=)
grammar Shrdlu;
tokens {
//operational tokens
MOVE = 'move';
TRANSFORM = 'transform';
CREATE = 'create';
MAKE = 'make';
ADD = 'add';
REMOVE = 'remove';
DELETE = 'delete';
//shape tokens
BOX = 'box';
RECTANGLE = 'rectangel';
CIRCLE = 'circle';
TRIANGLE = 'triangle';
SHAPE = 'shape';
SQUARE = 'square';
//color tokens
RED = 'red';
BLUE = 'blue';
GREEN = 'green';
BLACK = 'black';
PURPLE = 'purple';
YELLOW = 'yellow';
ORANGE = 'orange';
PINK = 'pink';
//size tokens
BIG = 'big';
LARGE = 'large';
TALL = 'tall';
SMALL = 'small';
TINY = 'tiny';
SHORT = 'short';
//relation size
BIGGEST = 'biggest';
LARGEST = 'largest';
TALLEST = 'tallest';
SMALLEST = 'smallest';
SHORTEST = 'shortest';
//argument size
BIGGER = 'bigger';
SMALLER = 'smaller';
SHORTER = 'shorter';
TALLER = 'taller';
LARGER = 'larger';
//alignment tokens
LEFT = 'left';
RIGHT = 'right';
OVER = 'over';
UNDER = 'under';
ABOVE = 'above';
BELOW = 'below';
TOP = 'top';
BOTTOM = 'bottom';
//prefix tokens
A = 'a';
AN = 'an';
ALL = 'all';
ANY = 'any';
EACH = 'each';
THE = 'the';
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
command
: sentence EOF
|
;
sentence
: WS? action WS object (WS argument)? WS?
;
action
: MOVE
| TRANSFORM
| CREATE
| MAKE
| ADD
| REMOVE
| DELETE
;
object
: prefix WS (property WS)? shape (WS relation WS object)?
;
a rgument
: color
| sizearg
| alignment
;
prefix
: A
| AN
| ALL
| ANY
| EACH
| THE
;
shape
: BOX
| RECTANGLE
| CIRCLE
| TRIANGLE
| SHAPE
| SQUARE
;
property
: size (WS property)?
| color (WS property)?
;
size
: BIG
| LARGE
| TALL
| SMALL
| TINY
| SHORT
;
sizearg
: BIGGER
| LARGER
| SMALLER
| TALLER
| SHORTER
;
relsize
: BIGGEST
| SMALLEST
| TALLEST
| LARGEST
;
relation
: alignment
| relsize
;
color
: RED
| BLUE
| GREEN
| BLACK
| PURPLE
| YELLOW
| ORANGE
| PINK
;
alignment
: LEFT
| RIGHT
| OVER
| UNDER
| ABOVE
| BELOW
| TOP
| BOTTOM
;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
NEWLINE
: '\r'? '\n'
;
WS
: (' '|'\t'|'\n'|'\r')+ {skip();}
;
然后我使用这段代码生成词法分析器和解析器。我下一步要做什么。我如何使用解析器,例如将“创建”转换为对象的创建。有人能指出我正确的方向吗?