Porting the code highlighter to Squeak

Anthony Hannan ajh18 at cornell.edu
Tue Apr 8 18:31:32 UTC 2003


Markus Gaelli <gaelli at emergent.de> wrote:
> do you have a grammar for "standard"-squeak-smalltalk for SmaCC?

Yes, Look at SqueakScanner and SqueakParser classes in the Closure
Compiler.  For convenience I have copied their specs below.

Cheers,
Anthony


SCANNER

<decimalNumber>:	[0-9]+ (\. [0-9]+)? ;
<radixNumber>:		[0-9]+ r [0-9A-Z]+ (\. [0-9A-Z]+)? ;
<exponentNumber>:	(<decimalNumber> | <radixNumber>) e \-? [0-9]+ ;
<number>:			<decimalNumber> | <radixNumber> | <exponentNumber> ;
<negativeNumber>:	\- <number> ;
<string>:				\'  [^\']* \' (\' [^\']* \')* ;
<name>:				[a-zA-Z] [a-zA-Z0-9]* ;
<keyword>:			<name> \: ;
<multikeyword>:		<name> \: (<name> \: )+ ;
<binarySymbol>:		[\~\-\!\@\%\&\*\+\=\\\|\?\/\>\<\,]
[\~\!\@\%\&\*\+\=\\\|\?\/\>\<\,]* ;
<assignment>:		\: = | \_ ;
<alternateKeyword>:	\: <name> \: (<name> \:)* ;
<whitespace>:		\s+ ;
<comment>:			\" [^\"]* \" ;
<character>:			\$ . ;
<variableAssignment>:	<name> \: \= ;

<anyChar>:			. ; # For VW literal arrays that handle #(;) -> #(#';')


PARSER

%id <name> <negativeNumber> <binarySymbol>;
%start Sequence MethodPattern;

Method:
	MethodPattern Sequence						{#method:}
|	MethodPattern Primitive Sequence			{#methodPrim:}
|	MethodPattern Temporaries Primitive Statements {#methodTempsPrim:};

MethodPattern:
	<name>										{#unaryMessage:}
|	<binarySymbol> Variable						{#messagePart:}
|	KeywordMethodPattern						{#first:};

KeywordMethodPattern:
	<keyword> Variable							{#messagePart:}
|	KeywordMethodPattern <keyword> Variable	{#addMessagePart:};

Primitive:
	"<" PrimitiveMessage ">"						{#primitiveMessage:};

Sequence:
	Statements									{#sequence:}
|	Temporaries Statements						{#sequenceWithTemps:};

Temporaries:
	"||"											{#array}
|	"|" TemporaryVariables "|"					{#second:};

TemporaryVariables:
												{#array}
|	TemporaryVariables Variable				{#add:};

Statements:
												{#array}
|	StatementList "."?							{#first:}
|	StatementList "." "^" Expression "."?			{#returnAdd:}
|	"^" Expression "."?							{#return:};

StatementList:
	Expression									{#firstIn:}
|	StatementList "." Expression					{#add3:};

Block:
	"[" BlockArgs "|" Sequence "]"					{#blockWithArgs:}
|	"[" Sequence "]"								{#blockNoArgs:}
|	"[" BlockArgs "]"								{#blockArgs:}
|	"[" BlockArgs "||" TemporaryVariables "|" Statements "]"
{#blockWithTemps:};

BlockArgs:
	":" Variable									{#secondIn:}
|	BlockArgs ":" Variable						{#add3:};

Expression:
	Assignment									{#first:}
|	Cascade										{#first:}
|	Primary									{#first:};

Primary:
	"(" Expression ")"								{#second:}
|	Array										{#first:}
|	Block										{#first:}
|	Literal										{#first:}
|	Variable									{#first:};

Assignment:
	Variable <assignment> Expression				{#assignment:};

Cascade:
	MessageSend								{#first:}
|	Cascade ";" Message							{#cascade:};

MessageSend:
	KeywordMessageSend						{#first:}
|	BinaryMessageSend							{#first:}
|	UnaryMessageSend							{#first:};

Message:
	UnaryMessage								{#first:}
|	BinaryMessage								{#first:}
|	KeywordMessage							{#first:};

KeywordMessageSend:
	BinaryMessageSend KeywordMessage			{#messageSend:}
|	UnaryMessageSend KeywordMessage			{#messageSend:}
|	Primary KeywordMessage					{#messageSend:};

KeywordMessage:
	<keyword> KeywordArgument				{#messagePart:}
|	KeywordMessage <keyword> KeywordArgument {#addMessagePart:};

KeywordArgument:
	BinaryMessageSend							{#first:}
|	UnaryMessageSend							{#first:}
|	Primary									{#first:};

BinaryMessageSend:
	BinaryMessageSend BinaryMessage			{#messageSend:}
|	UnaryMessageSend BinaryMessage			{#messageSend:}
|	Primary BinaryMessage						{#messageSend:};

BinaryMessage :
	<binarySymbol> BinaryArgument				{#messagePart:};

BinaryArgument:
	UnaryMessageSend							{#first:}
|	Primary									{#first:};

UnaryMessageSend :
	UnaryMessageSend UnaryMessage			{#messageSend:}
|	Primary UnaryMessage						{#messageSend:};

UnaryMessage :
	<name>										{#unaryMessage:};

Array:
	"{" Statements "}"								{#array:};

Variable: 
	<name>										{#variable:};

Literal:
	"true"										{#litTrue:}
|	"false"										{#litFalse:}
|	"nil"										{#litNil:}
|	<number>									{#litNumber:}
|	<negativeNumber>							{#litNumber:} 
|	<character>									{#litChar:}
|	<string>										{#litString:}
|	"#" <string>									{#litStringSymbol:}
|	"#" <name>									{#litSymbol:}
|	"#" <binarySymbol>							{#litSymbol:}
|	"#" <keyword>								{#litSymbol:}
|	"#" <multikeyword>							{#litSymbol:}
|	"#" <alternateKeyword>						{#litSymbol:}
|	"#" "[" ByteArray "]"							{#litArray:}
|	"#" "(" LiteralArray ")"						{#litArray:};

ByteArray:
												{#byteStream}
|	ByteArray <number>							{#byteStreamPut:};

LiteralArray:
												{#stream}
|	LiteralArray ArrayLiteral					{#streamPut:};

ArrayLiteral:
	Literal										{#value:}
|	<name>										{#valueSymbol:}
|	<binarySymbol>								{#valueSymbol:}
|	<keyword>									{#valueSymbol:}
|	<multikeyword>								{#valueSymbol:}
|	<alternateKeyword>							{#valueSymbol:}
|	"(" LiteralArray ")"							{#contents2:}
|	"[" ByteArray "]"							{#contents2:}
|	<anyChar>									{#valueSymbol:};

PrimitiveMessage:
	| PrimitiveMessage <keyword>
	| PrimitiveMessage Literal
	| PrimitiveMessage "("
	| PrimitiveMessage ")"
	| PrimitiveMessage "{"
	| PrimitiveMessage "}"
	| PrimitiveMessage ";"
	| PrimitiveMessage "."
	| PrimitiveMessage <name>
	| PrimitiveMessage <binarySymbol>;



More information about the Squeak-dev mailing list