webidl-0.1: cbits/lexer.ll
/*
* Copyright 2008, 2009 Google Inc.
* Copyright 2007 Nintendo Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* These coded instructions, statements, and computer programs contain
* software derived from the following specifications:
*
* W3C,
* Web IDL,
* W3C Working Draft 19 December 2008.
* http://www.w3.org/TR/WebIDL/
*
* Common Object Request Broker Architecture: Core Specification,
* Version 3.0.3, Object Management Group, Inc., March 2004.
* http://www.omg.org/technology/documents/formal/corba_iiop.htm.
*/
%{
#include "esidl.h"
#include "parser.h"
#ifndef VERBOSE
#define PRINTF(...) (__VA_ARGS__)
#else
#define PRINTF(...) printf(__VA_ARGS__)
#endif
extern "C" int yyparse(void);
void yyerror(const char* str);
extern "C" int yywrap();
void stepLocation()
{
yylloc.first_line = yylloc.last_line;
yylloc.first_column = yylloc.last_column + 1;
yylloc.last_column += yyleng;
}
static bool poundMode = false;
%}
/* regular definitions */
USP (\xe1\x9a\x80)|(\xe1\xa0\x8e)|(\xe2\x80[\x80-\x8a])|(\xe2\x80\xaf)|(\xe2\x81\x9f)|(\xe3\x80\x80)
LS (\xe2\x80\xa8)
PS (\xe2\x80\xa9)
NBSP (\xc2\xa0)
/* Lu up to \u00ff */
Lu (\xc3[\x80-\x9e])
/* Ll up to \u00ff */
Ll (\xc2[\xaa\xb5\xba])|(\xc3[\x9f-\xbf])
/* Unicode excluding USP, LS, PS, Lu and Li */
Unicode ([\xc4-\xdf][\x80-\xbf])|(\xe0[\xa0-\xbf][\x80-\xbf])|(\e1[\x80-\x99][\x80-\xbf])|(\e1\9a[\x81-\xbf])|(\e1[\x9b-\x9f][\x80-\xbf])|(\e1\xa0[\x80-\x8d\x8f-\xbf])|(\e1[\xa1-\xbf][\x80-\xbf])|(\e2\x80[\x8b-\xa7\xaa-\xbf])|(\e2\x81[\x80-\x9e\xa0-\xbf])|(\e2[\x82-\xbf][\x80-\xbf])|(\e3\x80[\x81-\xbf])|(\e3[\x81-\xbf][\x80-\xbf])|([\xe4-\xec][\x80-\xbf][\x80-\xbf])|(\xed[\x80-\x9f][\x80-\xbf])|([\xee-\xef][\x80-\xbf][\x80-\xbf])|(\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf])|([\xf1-\xf3][\x80-\xbf][\x80-\xbf][\x80-\xbf])|(\xf4[\x80-\x8f][\x80-\xbf][\x80-\xbf])
WhiteSpace ([ \t\v\f]|{NBSP}|{USP})
LineTerminator ([\n\r]|{LS}|{PS})
HexDigit [0-9A-Fa-f]
DecimalDigit [0-9]
HexIntegerLiteral 0(x|X){HexDigit}+
DecimalLiteral ({DecimalIntegerLiteral}\.[0-9]*{ExponentPart}?)|(\.[0-9]+{ExponentPart}?)|({DecimalIntegerLiteral}{ExponentPart}?)
ExponentPart (e|E)[\+\-]?[0-9]+
DecimalIntegerLiteral 0|([1-9][0-9]*)
OctalIntegerLiteral (0[0-8]+)
SingleEscapeCharacter ['\"\\bfnrtv]
NonEscapeCharacter [^'\"\\bfnrtv\n\r]
HexEscapeSequence x{HexDigit}{2}
UnicodeEscapeSequence u{HexDigit}{4}
CharacterEscapeSequence {SingleEscapeCharacter}|{NonEscapeCharacter}
EscapeSequence {CharacterEscapeSequence}|0|{HexEscapeSequence}|{UnicodeEscapeSequence}
SingleStringCharacter ([^'\\\n\r]|\\{EscapeSequence})
DoubleStringCharacter ([^\"\\\n\r]|\\{EscapeSequence})
IdentifierStart ([A-Za-z$_]|{Lu}|{Ll}|{Unicode})
IdentifierPart ([0-9]|{IdentifierStart}|(\\{UnicodeEscapeSequence}))
Identifier {IdentifierStart}{IdentifierPart}*
FixedPointLiteral (({DecimalIntegerLiteral}\.[0-9]*)|(\.[0-9]+)|({DecimalIntegerLiteral}))[dD]
MultiLineComment \/\*(([^*])|(\*[^/]))*\*\/
SingleLineComment \/\/
PoundSign ^{WhiteSpace}*#
%%
{WhiteSpace} {
++yylloc.last_column;
}
{LineTerminator} {
if (*yytext == '\n')
{
++yylloc.last_line;
yylloc.last_column = 0;
if (poundMode)
{
poundMode = false;
return EOL;
}
}
}
any {
stepLocation();
return ANY;
}
attribute {
stepLocation();
return ATTRIBUTE;
}
boolean {
stepLocation();
return BOOLEAN;
}
char {
stepLocation();
return CHAR;
}
const {
stepLocation();
return CONST;
}
double {
stepLocation();
return DOUBLE;
}
DOMString {
stepLocation();
return STRING;
}
exception {
stepLocation();
return EXCEPTION;
}
FALSE {
stepLocation();
return FALSE;
}
fixed {
stepLocation();
return FIXED;
}
float {
stepLocation();
return FLOAT;
}
getraises {
stepLocation();
return GETRAISES;
}
in {
stepLocation();
return IN;
}
inout {
stepLocation();
return INOUT;
}
interface {
stepLocation();
return INTERFACE;
}
long {
stepLocation();
return LONG;
}
module {
stepLocation();
return MODULE;
}
native {
stepLocation();
return NATIVE;
}
Object {
stepLocation();
yylval.name = strdup(Node::getBaseObjectName());
return IDENTIFIER;
}
octet {
stepLocation();
return OCTET;
}
oneway {
stepLocation();
return ONEWAY;
}
out {
stepLocation();
return OUT;
}
raises {
stepLocation();
return RAISES;
}
readonly {
stepLocation();
return READONLY;
}
setraises {
stepLocation();
return SETRAISES;
}
sequence {
stepLocation();
return SEQUENCE;
}
short {
stepLocation();
return SHORT;
}
string {
stepLocation();
return STRING;
}
struct {
stepLocation();
return STRUCT;
}
TRUE {
stepLocation();
return TRUE;
}
typedef {
stepLocation();
return TYPEDEF;
}
unsigned {
stepLocation();
return UNSIGNED;
}
valuetype {
stepLocation();
return VALUETYPE;
}
void {
stepLocation();
return VOID;
}
"::" {
stepLocation();
return OP_SCOPE;
}
"<<" {
stepLocation();
return OP_SHL;
}
">>" {
stepLocation();
return OP_SHR;
}
{Identifier} {
stepLocation();
yylval.name = strdup(yytext);
return IDENTIFIER;
}
{DecimalIntegerLiteral} {
stepLocation();
yylval.name = strdup(yytext);
return INTEGER_LITERAL;
}
{OctalIntegerLiteral} {
stepLocation();
yylval.name = strdup(yytext);
return INTEGER_LITERAL;
}
{HexIntegerLiteral} {
stepLocation();
yylval.name = strdup(yytext);
return INTEGER_LITERAL;
}
'{SingleStringCharacter}' {
stepLocation();
yylval.name = strdup(yytext);
return CHARACTER_LITERAL;
}
{DecimalLiteral} {
stepLocation();
yylval.name = strdup(yytext);
return FLOATING_PT_LITERAL;
}
\"{DoubleStringCharacter}*\" {
stepLocation();
yylval.name = strdup(yytext);
return STRING_LITERAL;
}
{FixedPointLiteral} {
stepLocation();
yylval.name = strdup(yytext);
return FIXED_PT_LITERAL;
}
{MultiLineComment} {
/* MultiLineComment */
for (char* s = yytext; *s; ++s)
{
if (*s == '\n')
{
++yylloc.last_line;
yylloc.last_column = 0;
}
else
{
++yylloc.last_column;
}
}
if (strncmp(yytext, "/**", 3) == 0)
{
/* Javadoc style comment */
yylval.name = strdup(yytext);
return JAVADOC;
}
}
{SingleLineComment} {
/* SingleLineComment */
int c;
do
{
c = yyinput();
} while (c != '\n' && c != '\r' && c != EOF);
++yylloc.last_line;
yylloc.last_column = 0;
}
{PoundSign} {
stepLocation();
poundMode = true;
return POUND_SIGN;
}
. {
stepLocation();
return (int) yytext[0];
}
%%