module languages/cpp/syntax/Replacement

imports languages/cpp/syntax/Ident
	basic/Strings
	basic/Integers
	

exports

lexical syntax
	"##" -> Cat
	[\!\@\$\%\^\&\*\(\)\-\+\=\[\]\|\<\>\.\/\?\:\~] -> Op
	[\;\,\{\}] -> Punct
	[\'] (Normal|Escaped) [\'] -> CharLit
	[\\][\t\ ]*[\n] -> Cont
	

%% Hack to circumvent bug in ASF library
lexical restrictions
	NatCon -/- [0-9]

context-free syntax
	Id -> Item {cons("id")}
	String -> Item {cons("string")}
	NatCon -> Item {cons("natcon")}
	Cont -> Item {cons("continuation")}
	CharLit -> Item {cons("charlit")}
	Op -> Item {cons("operator")}
	Punct -> Item {cons("punctuation")}

	Item+ -> Replacement



hiddens
sorts Replacement