Menu

[r4]: / trunk / JavaScript / Grammar / javascript.lex  Maximize  Restore  History

Download this file

349 lines (311 with data), 11.3 kB

public enum JsToken : int
{
	EOF,
	ID,
	INT,
	DOUBLE,
	
	LBRACE,
	RBRACE,
	LPARA,
	RPARA,
	LBRACK,
	RBRACK,
	DOT,
	SEMI,
	COMMA,
	LT,
	GT,
	GTEQ,
	LTEQ,
	EQEQ,
	NEQ,
	PLUS,
	MINUS,
	STAR,
	MOD,
	INC,
	DEC,
	SHL,
	SHR,
	SHRE,
	AND,
	OR,
	XOR,
	NOT,
	COMP,
	LOG_AND,
	LOG_OR,
	CONDITIONAL,
	COLON,
	ASSIGN,
	PLUSEQ,
	MINEQ,
	TIMESEQ,
	MODEQ,
	SHLEQ,
	SHREQ,
	SHREEQ,
	ANDEQ,
	OREQ,
	XOREQ,
	DIV,
	DIVEQ,
	
	BREAK,
	ELSE,
	NEW,
	VAR,
	CASE,
	FINALLY,
	RETURN,
	VOID,
	CATCH,
	FOR,
	SWITCH,
	WHILE,
	CONTINUE,
	FUNCTION,
	WITH,
	DEFAULT,
	IF,
	THROW,
	DELETE,
	IN,
	TRY,
	DO,
	INSTANCEOF,
	TYPEOF,
	NULL,
	TRUE,
	FALSE,
	THIS,
	REGEX,
	DEBUGGER,
	
	QUOTE,
	ESCQUOTE,
	TIC,
	ESCTIC,
	ESCCHAR,
	STRTXT
}

public class JsParseException : System.Exception
{
	public JsParseException ( string msg ) : base ( msg )
	{
	}
}

public class Yytoken  
{
	public Yytoken
	(
		JsToken token,
		string text,
		int line
	)
	{
		m_token = token;
		m_text = text;
		m_line = line;
	}

	public JsToken m_token;
	public string m_text;
	public int m_line;

	public override string ToString() 
	{
		return "Token: " + m_text  + " (line "+ m_line + ")";
	}
}

%%

%{
private bool m_eof = false;

public bool EOF
{
	get
	{
		return m_eof;
	}
}

public int LineNumber
{
	get
	{
		return yyline;
	}
	
	set
	{
		yyline = value;
	}
}

public int CharNumber
{
	get
	{
		return yychar;
	}
}
%}

%eof{
	m_eof = true;
%eof} 

%namespace JavaScript
%line
%char
%state YYSTRINGQUOTE
%state YYSTRINGTIC
%state YYCOMMENT

HexDigit	[0-9a-fA-F]
Digit		[0-9]
OctalDigit	[0-7]
TetraDigit	[0-3]
NonZeroDigit	[1-9]
Letter		[a-zA-Z_]
AnyButSlash	[^\/]
AnyButAstr	[^\*]
BLANK		[ ]
BLK		[\b]
TAB		[\t]
FF		[\f]
ESCCHR		[\\]
CR		[\r]
LF		[\n]
UniEsc          [\1b]

OctEscape1	[\\]{OctalDigit}
OctEscape2	[\\]{OctalDigit}{OctalDigit}
OctEscape3	[\\]{TetraDigit}{OctalDigit}{OctalDigit}
OctEscape	({OctEscape1}|{OctEscape2}|{OctEscape3})

Escape		([\\]([r]|[n]|[b]|[f]|[t]|[\\]|))
ULetter         ({Letter}|{UniEsc})
Identifier 	{ULetter}({ULetter}|{Digit})*

Comment1        ("/*")(.|\r|\n)*("*/")
Comment2        \/\/.*
Comment			({Comment2})

Dimension	[\[]({CR}|{LF}|{FF}|{TAB}|{BLK}|{BLANK}|{Comment})*[\]]

IntSuffix	([l]|[L])
DecimalNum	{NonZeroDigit}{Digit}*{IntSuffix}?
OctalNum	([0]{OctalDigit}*{IntSuffix}?)
HexNum		[0]([x]|[X]){HexDigit}{HexDigit}*{IntSuffix}?
IntegerLiteral	({DecimalNum}|{OctalNum}|{HexNum})

Sign		([\+]|[\-])
FlSuffix	([f]|[F]|[d]|[D])
SignedInt	({Sign}?{Digit}+)
Expo		([e]|[E])
ExponentPart	({Expo}{SignedInt}?)
Float1          {Digit}+[\.]{Digit}+{ExponentPart}?{FlSuffix}?
Float2		[\.]{Digit}+{ExponentPart}?{FlSuffix}?
Float3		{Digit}+{ExponentPart}{FlSuffix}?
Float4		{Digit}+{FlSuffix}
FloatingPoint	({Float1}|{Float2}|{Float3}|{Float4})

STRTXT=({Digit}|{Letter}|[ ]|[\:\;\,\.\!\@\#\$\%\&\*\(\)\-\=\+\|\}\]\[\{\?/\>\<\~\`])
STRTXTS=(({STRTXT}|["^"\t])*)
NEWLINE=((\r\n)|\n)
STRING_TEXT=([\"](([\\\\]|{STRTXT}|[\']|["^"])*)([\"]))
STRING_TEXT2=(([\'])(([\\\\]|{STRTXT}|[\"]|["^"])*)([\']))

REX_SYM=([ ]|[\\]|[\:]|[\;]|[\,]|[\.]|[\!]|[\@]|[\#]|[\$]|[\%]|[\^]|[\&]|[\*]|[\(]|[\)]|[\-]|[\_]|[\=]|[\+]|[\|]|[\}]|[\]]|[\[]|[\{]|[\?]|[\>]|[\<]|[\~]|[\`])
REX_EXPR=(/[^/\*]({Digit}|{Letter}|{REX_SYM}|("\/"))*(/))

%%

<YYINITIAL> "{" {return (new Yytoken(JsToken.LBRACE,yytext(),yyline));}
<YYINITIAL> "}" {return (new Yytoken(JsToken.RBRACE,yytext(),yyline));} 
<YYINITIAL> "(" {return (new Yytoken(JsToken.LPARA,yytext(),yyline));}
<YYINITIAL> ")" {return (new Yytoken(JsToken.RPARA,yytext(),yyline));}
<YYINITIAL> "[" {return (new Yytoken(JsToken.LBRACK,yytext(),yyline));}
<YYINITIAL> "]" {return (new Yytoken(JsToken.RBRACK,yytext(),yyline));}
<YYINITIAL> "." {return (new Yytoken(JsToken.DOT,yytext(),yyline));}
<YYINITIAL> ";" {return (new Yytoken(JsToken.SEMI,yytext(),yyline));}
<YYINITIAL> "," {return (new Yytoken(JsToken.COMMA,yytext(),yyline));}
<YYINITIAL> "<" {return (new Yytoken(JsToken.LT,yytext(),yyline));}
<YYINITIAL> ">" {return (new Yytoken(JsToken.GT,yytext(),yyline));}
<YYINITIAL> ">=" {return (new Yytoken(JsToken.GTEQ,yytext(),yyline));}
<YYINITIAL> "<=" {return (new Yytoken(JsToken.LTEQ,yytext(),yyline));}
<YYINITIAL> "==" {return (new Yytoken(JsToken.EQEQ,yytext(),yyline));}
<YYINITIAL> "!=" {return (new Yytoken(JsToken.NEQ,yytext(),yyline));}
<YYINITIAL> "+" {return (new Yytoken(JsToken.PLUS,yytext(),yyline));}
<YYINITIAL> "-" {return (new Yytoken(JsToken.MINUS,yytext(),yyline));}
<YYINITIAL> "*" {return (new Yytoken(JsToken.STAR,yytext(),yyline));}
<YYINITIAL> "%" {return (new Yytoken(JsToken.MOD,yytext(),yyline));}
<YYINITIAL> "++" {return (new Yytoken(JsToken.INC,yytext(),yyline));}
<YYINITIAL> "--" {return (new Yytoken(JsToken.DEC,yytext(),yyline));}
<YYINITIAL> "<<" {return (new Yytoken(JsToken.SHL,yytext(),yyline));}
<YYINITIAL> ">>" {return (new Yytoken(JsToken.SHR,yytext(),yyline));}
<YYINITIAL> ">>>" {return (new Yytoken(JsToken.SHRE,yytext(),yyline));}
<YYINITIAL> "&" {return (new Yytoken(JsToken.AND,yytext(),yyline));}
<YYINITIAL> "|" {return (new Yytoken(JsToken.OR,yytext(),yyline));}
<YYINITIAL> "^" {return (new Yytoken(JsToken.XOR,yytext(),yyline));}
<YYINITIAL> "!" {return (new Yytoken(JsToken.NOT,yytext(),yyline));}
<YYINITIAL> "~" {return (new Yytoken(JsToken.COMP,yytext(),yyline));}
<YYINITIAL> "&&" {return (new Yytoken(JsToken.LOG_AND,yytext(),yyline));}
<YYINITIAL> "||" {return (new Yytoken(JsToken.LOG_OR,yytext(),yyline));}
<YYINITIAL> "?" {return (new Yytoken(JsToken.CONDITIONAL,yytext(),yyline));}
<YYINITIAL> ":" {return (new Yytoken(JsToken.COLON,yytext(),yyline));}
<YYINITIAL> "=" {return (new Yytoken(JsToken.ASSIGN,yytext(),yyline));}
<YYINITIAL> "+=" {return (new Yytoken(JsToken.PLUSEQ,yytext(),yyline));}
<YYINITIAL> "-=" {return (new Yytoken(JsToken.MINEQ,yytext(),yyline));}
<YYINITIAL> "*=" {return (new Yytoken(JsToken.TIMESEQ,yytext(),yyline));}
<YYINITIAL> "%=" {return (new Yytoken(JsToken.MODEQ,yytext(),yyline));}
<YYINITIAL> "<<=" {return (new Yytoken(JsToken.SHLEQ,yytext(),yyline));}
<YYINITIAL> ">>=" {return (new Yytoken(JsToken.SHREQ,yytext(),yyline));}
<YYINITIAL> ">>>=" {return (new Yytoken(JsToken.SHREEQ,yytext(),yyline));}
<YYINITIAL> "&=" {return (new Yytoken(JsToken.ANDEQ,yytext(),yyline));}
<YYINITIAL> "|=" {return (new Yytoken(JsToken.OREQ,yytext(),yyline));}
<YYINITIAL> "^=" {return (new Yytoken(JsToken.XOREQ,yytext(),yyline));}
<YYINITIAL> "/" {return (new Yytoken(JsToken.DIV,yytext(),yyline));}
<YYINITIAL> "/=" {return (new Yytoken(JsToken.DIVEQ,yytext(),yyline));}

<YYINITIAL> "this" {return (new Yytoken(JsToken.THIS,yytext(),yyline));}
<YYINITIAL> "break" {return (new Yytoken(JsToken.BREAK,yytext(),yyline));}
<YYINITIAL> "else" {return (new Yytoken(JsToken.ELSE,yytext(),yyline));}
<YYINITIAL> "new" {return (new Yytoken(JsToken.NEW,yytext(),yyline));}
<YYINITIAL> "var" {return (new Yytoken(JsToken.VAR,yytext(),yyline));}
<YYINITIAL> "case" {return (new Yytoken(JsToken.CASE,yytext(),yyline));}
<YYINITIAL> "finally" {return (new Yytoken(JsToken.FINALLY,yytext(),yyline));}
<YYINITIAL> "return" {return (new Yytoken(JsToken.RETURN,yytext(),yyline));}
<YYINITIAL> "void" {return (new Yytoken(JsToken.VOID,yytext(),yyline));}
<YYINITIAL> "catch" {return (new Yytoken(JsToken.CATCH,yytext(),yyline));}
<YYINITIAL> "for" {return (new Yytoken(JsToken.FOR,yytext(),yyline));}
<YYINITIAL> "switch" {return (new Yytoken(JsToken.SWITCH,yytext(),yyline));}
<YYINITIAL> "while" {return (new Yytoken(JsToken.WHILE,yytext(),yyline));}
<YYINITIAL> "continue" {return (new Yytoken(JsToken.CONTINUE,yytext(),yyline));}
<YYINITIAL> "function" {return (new Yytoken(JsToken.FUNCTION,yytext(),yyline));}
<YYINITIAL> "with" {return (new Yytoken(JsToken.WITH,yytext(),yyline));}
<YYINITIAL> "default" {return (new Yytoken(JsToken.DEFAULT,yytext(),yyline));}
<YYINITIAL> "if" {return (new Yytoken(JsToken.IF,yytext(),yyline));}
<YYINITIAL> "throw" {return (new Yytoken(JsToken.THROW,yytext(),yyline));}
<YYINITIAL> "delete" {return (new Yytoken(JsToken.DELETE,yytext(),yyline));}
<YYINITIAL> "in" {return (new Yytoken(JsToken.IN,yytext(),yyline));}
<YYINITIAL> "try" {return (new Yytoken(JsToken.TRY,yytext(),yyline));}
<YYINITIAL> "do" {return (new Yytoken(JsToken.DO,yytext(),yyline));}
<YYINITIAL> "instanceof" {return (new Yytoken(JsToken.INSTANCEOF,yytext(),yyline));}
<YYINITIAL> "typeof" {return (new Yytoken(JsToken.TYPEOF,yytext(),yyline));}
<YYINITIAL> "null" {return (new Yytoken(JsToken.NULL,yytext(),yyline));}
<YYINITIAL> "true" {return (new Yytoken(JsToken.TRUE,yytext(),yyline));}
<YYINITIAL> "false" {return (new Yytoken(JsToken.FALSE,yytext(),yyline));}
<YYINITIAL> "debugger"	{return (new Yytoken(JsToken.DEBUGGER,yytext(),yyline));}

<YYINITIAL> {REX_EXPR}		{return (new Yytoken(JsToken.REGEX,yytext(),yyline));}

<YYINITIAL> \"			{yybegin(YYSTRINGQUOTE); return (new Yytoken(JsToken.QUOTE,yytext(),yyline));}
<YYINITIAL> '				{yybegin(YYSTRINGTIC); return (new Yytoken(JsToken.TIC,yytext(),yyline));}

<YYSTRINGQUOTE,YYSTRINGTIC> \\\"		{return (new Yytoken(JsToken.ESCQUOTE,yytext(),yyline));}
<YYSTRINGQUOTE,YYSTRINGTIC> \\'			{return (new Yytoken(JsToken.ESCTIC,yytext(),yyline));}

<YYSTRINGQUOTE,YYSTRINGTIC> \\{STRTXT}	{return (new Yytoken(JsToken.ESCCHAR,yytext(),yyline));}
<YYSTRINGQUOTE,YYSTRINGTIC> \\\\		{return (new Yytoken(JsToken.ESCCHAR,yytext(),yyline));}
<YYSTRINGQUOTE,YYSTRINGTIC>	{STRTXTS}	{return (new Yytoken(JsToken.STRTXT,yytext(),yyline));}
<YYSTRINGQUOTE> '			{return (new Yytoken(JsToken.STRTXT,yytext(),yyline));}
<YYSTRINGTIC> \"			{return (new Yytoken(JsToken.STRTXT,yytext(),yyline));}

<YYSTRINGQUOTE> \"			{yybegin(YYINITIAL); return (new Yytoken(JsToken.QUOTE,yytext(),yyline));}
<YYSTRINGTIC> '				{yybegin(YYINITIAL); return (new Yytoken(JsToken.TIC,yytext(),yyline));}

<YYINITIAL> "/*"			{yybegin(YYCOMMENT); return null;}
<YYCOMMENT> .				{return null;}
<YYCOMMENT> [\r\n]			{return null;}
<YYCOMMENT> "*/"			{yybegin(YYINITIAL); return null;}

<YYINITIAL> {Identifier}	{return (new Yytoken(JsToken.ID,yytext(),yyline));}
<YYINITIAL> {DecimalNum}    {return (new Yytoken(JsToken.INT,yytext(),yyline));}
<YYINITIAL> {HexNum}        {return (new Yytoken(JsToken.INT,yytext(),yyline));}
<YYINITIAL> {OctalNum}      {return (new Yytoken(JsToken.INT,yytext(),yyline));}
<YYINITIAL> {Float1}        {return (new Yytoken(JsToken.DOUBLE,yytext(),yyline));}
<YYINITIAL> {Float2}        {return (new Yytoken(JsToken.DOUBLE,yytext(),yyline));}
<YYINITIAL> {Float3}        {return (new Yytoken(JsToken.DOUBLE,yytext(),yyline));}
<YYINITIAL> {Float4}        {return (new Yytoken(JsToken.DOUBLE,yytext(),yyline));}
<YYINITIAL> {CR}   		{ return null; }
<YYINITIAL> {LF}		{ return null; }
<YYINITIAL> {FF}		{ return null; }
<YYINITIAL> {TAB}		{ return null; }
<YYINITIAL> {BLK}       { return null; }
<YYINITIAL> {BLANK}		{ return null; }
<YYINITIAL> {Comment}	{ return null; }

<YYINITIAL> . { throw new JsParseException ("Unmatched input: " + yytext() + " on line " + yyline); }

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.