module languages/cpp/syntax/Macros

imports languages/cpp/syntax/Text
	languages/cpp/syntax/Replacement

exports


context-free syntax


	%% Constants 
	Id -> CId	
	"#" "define" id:CId replacement:Replacement? 
			NewLine -> Line {cons("def-const")}

	%% the prefer is needed because there can be comments
	%% instead of a real replacement, which is recognized
	%% as a replacement, and thus an ambiguity arises.
	"#" "define" id:CId NewLine -> Line {cons("def-const"),prefer} 

	%% Macros	
	Id -> FId
	id:FId "(" args:{Id ","}* ")" -> Signature {cons("fix-args")}
	id:FId "(" args:{Id ","}+ "," "..." ")" -> Signature {cons("fix-var-args")}
	id:FId "(" "..." ")"  -> Signature {cons("var-args")}
	"#" "define"  signature:Signature 
		replacement:Replacement? NewLine -> Line {cons("def-macro")}


	"#" "undef" id:Id NewLine -> Line {cons("undef")}

context-free restrictions
	CId -/- [\(]
	FId -/- [\t\ ]