Field references ($fieldName) and quoted literal (anyWord)

This commit is contained in:
Andrey Breslav
2011-01-04 01:09:42 +03:00
parent 1f09ee1965
commit 5fb3f37cab
9 changed files with 515 additions and 423 deletions
@@ -110,6 +110,7 @@ public interface JetNodeTypes {
JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN"); JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN");
JetNodeType OBJECT_LITERAL = new JetNodeType("OBJECT_LITERAL"); JetNodeType OBJECT_LITERAL = new JetNodeType("OBJECT_LITERAL");
JetNodeType ROOT_NAMESPACE = new JetNodeType("ROOT_NAMESPACE"); JetNodeType ROOT_NAMESPACE = new JetNodeType("ROOT_NAMESPACE");
JetNodeType FIELD_REFERENCE = new JetNodeType("FIELD_REFERENCE");
IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME"); IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME");
} }
@@ -31,6 +31,12 @@ public class JetHighlighter extends SyntaxHighlighterBase {
SyntaxHighlighterColors.KEYWORD.getDefaultAttributes() SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()
); );
public static final TextAttributesKey JET_FIELD_IDENTIFIER = TextAttributesKey.createTextAttributesKey(
"JET.FIELD.IDENTIFIER",
// TODO: proper attributes
SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()
);
private static final TextAttributesKey JET_NUMBER = TextAttributesKey.createTextAttributesKey( private static final TextAttributesKey JET_NUMBER = TextAttributesKey.createTextAttributesKey(
"JET.NUMBER", "JET.NUMBER",
SyntaxHighlighterColors.NUMBER.getDefaultAttributes() SyntaxHighlighterColors.NUMBER.getDefaultAttributes()
@@ -68,6 +74,7 @@ public class JetHighlighter extends SyntaxHighlighterBase {
fillMap(keys1, JetTokens.KEYWORDS, JET_KEYWORD); fillMap(keys1, JetTokens.KEYWORDS, JET_KEYWORD);
keys1.put(JetTokens.FIELD_IDENTIFIER, JET_FIELD_IDENTIFIER);
keys1.put(JetTokens.INTEGER_LITERAL, JET_NUMBER); keys1.put(JetTokens.INTEGER_LITERAL, JET_NUMBER);
keys1.put(JetTokens.LONG_LITERAL, JET_NUMBER); keys1.put(JetTokens.LONG_LITERAL, JET_NUMBER);
keys1.put(JetTokens.FLOAT_LITERAL, JET_NUMBER); keys1.put(JetTokens.FLOAT_LITERAL, JET_NUMBER);
@@ -324,6 +324,9 @@ public class JetExpressionParsing extends AbstractJetParsing {
VAR_KEYWORD, TYPE_KEYWORD, DECOMPOSER_KEYWORD)) { VAR_KEYWORD, TYPE_KEYWORD, DECOMPOSER_KEYWORD)) {
parseLocalDeclaration(); parseLocalDeclaration();
} }
else if (at(FIELD_IDENTIFIER)) {
parseOneTokenExpression(FIELD_REFERENCE);
}
else if (at(IDENTIFIER)) { else if (at(IDENTIFIER)) {
if (JetParsing.MODIFIER_KEYWORD_MAP.containsKey(myBuilder.getTokenText())) { if (JetParsing.MODIFIER_KEYWORD_MAP.containsKey(myBuilder.getTokenText())) {
if (!parseLocalDeclaration()) { if (!parseLocalDeclaration()) {
@@ -337,7 +340,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
parseFunctionLiteral(); parseFunctionLiteral();
} }
else if (!parseLiteralConstant()) { else if (!parseLiteralConstant()) {
// TODO: betters recovery if FIRST(expression) did not match // TODO: better recovery if FIRST(expression) did not match
errorAndAdvance("Expecting an expression"); errorAndAdvance("Expecting an expression");
} }
} }
+7 -1
View File
@@ -21,7 +21,12 @@ DIGIT=[0-9]
HEX_DIGIT=[0-9A-Fa-f] HEX_DIGIT=[0-9A-Fa-f]
WHITE_SPACE_CHAR=[\ \n\t\f] WHITE_SPACE_CHAR=[\ \n\t\f]
IDENTIFIER=[:jletter:] [:jletterdigit:]* // TODO: prohibit '$' in identifiers?
PLAIN_IDENTIFIER=[:jletter:] [:jletterdigit:]*
// TODO: this one MUST allow everything accepted by the runtime
ESCAPED_IDENTIFIER = `{PLAIN_IDENTIFIER}`
IDENTIFIER = {PLAIN_IDENTIFIER}|{ESCAPED_IDENTIFIER}
FIELD_IDENTIFIER = \${IDENTIFIER}
BLOCK_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*" BLOCK_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*"
DOC_COMMENT="/*""*"+("/"|([^"/""*"]{COMMENT_TAIL}))? DOC_COMMENT="/*""*"+("/"|([^"/""*"]{COMMENT_TAIL}))?
@@ -111,6 +116,7 @@ RAW_STRING_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}?
<YYINITIAL> "do" { return JetTokens.DO_KEYWORD ;} <YYINITIAL> "do" { return JetTokens.DO_KEYWORD ;}
<YYINITIAL> "as" { return JetTokens.AS_KEYWORD ;} <YYINITIAL> "as" { return JetTokens.AS_KEYWORD ;}
<YYINITIAL> {FIELD_IDENTIFIER} { return JetTokens.FIELD_IDENTIFIER; }
<YYINITIAL> {IDENTIFIER} { return JetTokens.IDENTIFIER; } <YYINITIAL> {IDENTIFIER} { return JetTokens.IDENTIFIER; }
<YYINITIAL> "===" { return JetTokens.EQEQEQ ; } <YYINITIAL> "===" { return JetTokens.EQEQEQ ; }
@@ -58,6 +58,7 @@ public interface JetTokens {
JetToken IDENTIFIER = new JetToken("IDENTIFIER"); JetToken IDENTIFIER = new JetToken("IDENTIFIER");
JetToken FIELD_IDENTIFIER = new JetToken("FIELD_IDENTIFIER");
JetToken LBRACKET = new JetToken("LBRACKET"); JetToken LBRACKET = new JetToken("LBRACKET");
JetToken RBRACKET = new JetToken("RBRACKET"); JetToken RBRACKET = new JetToken("RBRACKET");
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
[`return`] fun `namespace`() {
`class`()
}
+30
View File
@@ -0,0 +1,30 @@
JetFile: QuotedIdentifiers.jet
NAMESPACE
FUN
MODIFIER_LIST
ATTRIBUTE_ANNOTATION
PsiElement(LBRACKET)('[')
ATTRIBUTE
USER_TYPE
PsiElement(IDENTIFIER)('`return`')
PsiElement(RBRACKET)(']')
PsiWhiteSpace(' ')
PsiElement(fun)('fun')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('`namespace`')
TYPE_PARAMETER_LIST
<empty list>
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
CALL_EXPRESSION
PsiElement(IDENTIFIER)('`class`')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
@@ -927,7 +927,8 @@ JetFile: BinaryHeap.jet
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
BINARY_EXPRESSION BINARY_EXPRESSION
PsiElement(IDENTIFIER)('$value') FIELD_REFERENCE
PsiElement(FIELD_IDENTIFIER)('$value')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(EQ)('=') PsiElement(EQ)('=')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')