Warning, /kdevelop/kdev-css/parser/css.g is written in an unsupported language. File is not indexed.
0001 -- This file is part of KDevelop 0002 -- 0003 -- Copyright 2009 Niko Sams <niko.sams@gmail.com> 0004 -- 0005 -- This file is based on WebCore/css/CSSGrammar.y 0006 -- Copyright (C) 2002-2003 Lars Knoll (knoll@kde.org) 0007 -- Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 0008 -- Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) 0009 -- Copyright (C) 2008 Eric Seidel <eric@webkit.org> 0010 -- 0011 -- This library is free software; you can redistribute it and/or 0012 -- modify it under the terms of the GNU Lesser General Public 0013 -- License as published by the Free Software Foundation; either 0014 -- version 2 of the License, or (at your option) any later version. 0015 -- 0016 -- This library is distributed in the hope that it will be useful, 0017 -- but WITHOUT ANY WARRANTY; without even the implied warranty of 0018 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0019 -- Lesser General Public License for more details. 0020 -- 0021 -- You should have received a copy of the GNU Lesser General Public 0022 -- License along with this library; if not, write to the Free Software 0023 -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0024 -- 0025 0026 [: 0027 namespace Css 0028 { 0029 class ParseSession; 0030 } 0031 :] 0032 0033 %parser_declaration_header "QString" 0034 %parser_declaration_header "debug.h" 0035 %parser_declaration_header "language/duchain/problem.h" 0036 %parser_declaration_header "language/editor/documentrange.h" 0037 0038 0039 0040 ------------------------------------------------------------ 0041 -- Export macro to use the parser in a shared lib 0042 ------------------------------------------------------------ 0043 %export_macro "KDEVCSSPARSER_EXPORT" 0044 %export_macro_header "parserexport.h" 0045 0046 0047 ------------------------------------------------------------ 0048 -- Enumeration types for additional AST members, 0049 -- in the global "Css" namespace 0050 ------------------------------------------------------------ 0051 %namespace 0052 [: 0053 class Tokenizer; 0054 :] 0055 0056 ------------------------------------------------------------ 0057 -- Parser class members 0058 ------------------------------------------------------------ 0059 0060 %parserclass (public declaration) 0061 [: 0062 /** 0063 * Transform the raw input into tokens. 0064 * When this method returns, the parser's token stream has been filled 0065 * and any parse*() method can be called. 0066 */ 0067 void tokenize(const QString& contents); 0068 0069 enum ProblemType { 0070 Error, 0071 Warning, 0072 Info 0073 }; 0074 void reportProblem( Parser::ProblemType type, const QString& message ); 0075 QList<KDevelop::ProblemPointer> problems() { 0076 return m_problems; 0077 } 0078 QString tokenText(qint64 begin, qint64 end); 0079 void setDebug(bool debug); 0080 void setCurrentDocument(const KDevelop::IndexedString& url); 0081 0082 :] 0083 0084 %parserclass (private declaration) 0085 [: 0086 QString m_contents; 0087 bool m_debug; 0088 KDevelop::IndexedString m_currentDocument; 0089 QList<KDevelop::ProblemPointer> m_problems; 0090 :] 0091 0092 0093 0094 ----------------------------------------------------------- 0095 -- List of defined tokens 0096 ----------------------------------------------------------- 0097 0098 -- keywords:< 0099 %token IMPORT_SYM ("@import"), PAGE_SYM ("@page"), MEDIA_SYM ("@media"), 0100 FONT_FACE_SYM ("@font-face"), CHARSET_SYM ("@charset"), NAMESPACE_SYM ("@namespace"), 0101 IMPORTANT_SYM ("!important") ;; 0102 0103 %token WHITESPACE ("whitespace"), IDENT ("identifier"), STRING ("string"), SGML_CD ("<!--/-->"), 0104 NOTFUNCTION ("not function"), URI ("uri"), FUNCTION ("function"), UNICODERANGE ("unicoderange"), 0105 HEXCOLOR ("hex color"), NTH ("nth"), IDSEL ("id selector"), 0106 MEDIA_NOT ("media not"), MEDIA_ONLY ("media only"), MEDIA_AND ("media and") ;; 0107 0108 -- seperators: 0109 %token COMMA (","), LPAREN ("("), RPAREN (")"), LBRACE ("{"), RBRACE ("}"), 0110 LBRACKET ("["), RBRACKET ("]"), 0111 COLON (":"), STAR("*"), SEMICOLON (";"), DOT ("."), EQUALS("="), 0112 INCLUDES ("~="), DASHMATCH ("|="), BEGINSWITH ("^="), ENDSWITH ("$="), 0113 CONTAINS ("*="), MINUS ("-"), PLUS ("+"), DIVIDE ("/") ;; 0114 0115 %token EMS ("em"), QEMS ("__qem"), EXS ("ex"), PXS ("ps"), CMS ("cm"), MMS ("mm"), 0116 INS ("in"), PTS ("pt"), PCS ("pc"), DEGS ("deg"), RADS ("rad"), GRADS ("grad"), 0117 MSECS ("ms"), SECS ("s"), HERZ ("Hz"), DPI ("dpi"), DPCM ("dpcm"), KHERZ ("kHz"), 0118 DIMEN ("dimen"), PERCENTAGE ("%"), INTEGER ("integer"), FLOAT ("float") ;; 0119 0120 -- token that makes the parser fail in any case: 0121 %token INVALID ("invalid token") ;; 0122 0123 0124 0125 -- The actual grammar starts here. 0126 0127 -- these rule isn't used by the parser, it's as ast node 0128 -- to support multiple style elements in one html file 0129 0 0130 -> html [ 0131 member variable elements: QList<AstNode*>; 0132 ];; 0133 0134 start=start 0135 -> styleElement [ 0136 member variable session: ParseSession*; 0137 ];; 0138 0139 declarationList=declarationList 0140 -> inlineStyle [ 0141 member variable session: ParseSession*; 0142 ];; 0143 -- end custom rules 0144 0145 0146 (charset=charset | 0) 0147 maybeSgml 0148 imports=importList 0149 --variablesList 0150 --namespaceList 0151 rules=ruleList 0152 -> start ;; 0153 0154 WHITESPACE+ | 0 0155 -> maybeSpace ;; 0156 0157 maybeSpace (SGML_CD @ maybeSpace | 0) 0158 -> maybeSgml ;; 0159 0160 0161 -- closing_brace: 0162 -- '}' 0163 -- | %prec LOWEST_PREC TOKEN_EOF 0164 -- ; 0165 0166 CHARSET_SYM maybeSpace STRING maybeSpace SEMICOLON maybeSpace 0167 -> charset ;; 0168 0169 (#imports=import maybeSgml)* 0170 -> importList ;; 0171 0172 -- 0 0173 -- | variablesList variablesRule maybeSgml 0174 -- -> variablesList ;; 0175 0176 -- 0 0177 -- | namespaceList namespace maybeSgml 0178 ---> namespaceList ;; 0179 0180 (#rules=rule maybeSgml)* 0181 -> ruleList ;; 0182 0183 ruleset=ruleset 0184 -- | media 0185 -- | page 0186 -- | font_face 0187 -- | keyframes 0188 -> rule ;; 0189 -- 0190 -- block_ruleList: 0191 -- /* empty */ { $$ = 0; } 0192 -- | block_ruleList block_rule maybeSgml 0193 -- ; 0194 -- 0195 -- block_valid_rule: 0196 -- ruleset 0197 -- | page 0198 -- | font_face 0199 -- | keyframes 0200 -- ; 0201 -- 0202 -- block_rule: 0203 -- block_valid_rule 0204 -- | invalid_rule 0205 -- | invalid_at 0206 -- | invalid_import 0207 -- | invalid_media 0208 -- ; 0209 0210 --IMPORT_SYM maybeSpace stringOrUri maybeSpace maybeMediaList SEMICOLON 0211 IMPORT_SYM maybeSpace stringOrUri maybeSpace SEMICOLON maybeSpace 0212 -> import ;; 0213 0214 -- variablesRule: 0215 -- WEBKIT_VARIABLES_SYM maybeSpace maybeMediaList '{' maybeSpace variables_declaration_list '}' 0216 -- | 0217 -- WEBKIT_DEFINE_SYM maybeSpace variables_mediaList '{' maybeSpace variables_declaration_list '}' 0218 -- ; 0219 -- 0220 -- variables_mediaList: 0221 -- /* empty */ 0222 -- | 0223 -- VARIABLES_FOR WHITESPACE mediaList 0224 -- ; 0225 -- 0226 -- variables_declaration_list: 0227 -- variables_declaration 0228 -- | variables_decl_list variables_declaration 0229 -- | variables_decl_list 0230 -- | error invalid_block_list error 0231 -- | error 0232 -- | variables_decl_list error 0233 -- ; 0234 -- 0235 -- variables_decl_list: 0236 -- variables_declaration ';' maybeSpace 0237 -- | variables_declaration invalid_block_list ';' maybeSpace 0238 -- | error ';' maybeSpace 0239 -- | error invalid_block_list error ';' maybeSpace 0240 -- | variables_decl_list variables_declaration ';' maybeSpace 0241 -- | variables_decl_list error ';' maybeSpace 0242 -- | variables_decl_list error invalid_block_list error ';' maybeSpace 0243 -- ; 0244 -- 0245 -- variables_declaration: 0246 -- variable_name ':' maybeSpace expr 0247 -- | 0248 -- variable_name maybeSpace '{' maybeSpace declaration_list '}' maybeSpace 0249 -- | 0250 -- variable_name error 0251 -- | 0252 -- variable_name ':' maybeSpace error expr 0253 -- | 0254 -- variable_name ':' maybeSpace /* @variables { varname: } Just reduce away this variable with no value. */ 0255 -- | 0256 -- variable_name ':' maybeSpace error /* if we come across rules with invalid values like this case: @variables { varname: *; }, just discard the property/value pair */ 0257 -- ; 0258 -- 0259 -- variable_name: 0260 -- IDENT maybeSpace 0261 -- ; 0262 -- 0263 -- namespace: 0264 -- NAMESPACE_SYM maybeSpace maybe_ns_prefix stringOrUri maybeSpace ';' 0265 -- | NAMESPACE_SYM error invalid_block 0266 -- | NAMESPACE_SYM error ';' 0267 -- ; 0268 -- 0269 -- maybe_ns_prefix: 0270 -- /* empty */ 0271 -- | IDENT WHITESPACE 0272 -- ; 0273 0274 string=STRING 0275 | uri=URI 0276 -> stringOrUri ;; 0277 0278 -- media_feature: 0279 -- IDENT maybeSpace 0280 -- ; 0281 -- 0282 -- maybe_media_value: 0283 -- /*empty*/ 0284 -- | ':' maybeSpace expr maybeSpace 0285 -- ; 0286 -- 0287 -- mediaQuery_exp: 0288 -- '(' maybeSpace media_feature maybeSpace maybe_media_value ')' maybeSpace 0289 -- ; 0290 -- 0291 -- mediaQueryExpList: 0292 -- mediaQuery_exp 0293 -- | mediaQueryExpList maybeSpace MEDIA_AND maybeSpace mediaQuery_exp 0294 -- ; 0295 -- 0296 -- maybe_and_mediaQueryExpList: 0297 -- /*empty*/ 0298 -- | MEDIA_AND maybeSpace mediaQueryExpList 0299 -- ; 0300 -- 0301 -- maybe_media_restrictor: 0302 -- /*empty*/ 0303 -- | MEDIA_ONLY 0304 -- | MEDIA_NOT 0305 -- ; 0306 -- 0307 -- mediaQuery: 0308 -- mediaQueryExpList 0309 -- | 0310 -- maybe_media_restrictor maybeSpace medium maybe_and_mediaQueryExpList 0311 -- ; 0312 0313 -- 0 0314 -- | mediaList 0315 ---> maybeMediaList ;; 0316 0317 -- mediaQuery 0318 -- | mediaList COMMA maybeSpace mediaQuery 0319 -- | mediaList error 0320 ---> mediaList ;; 0321 0322 -- media: 0323 -- MEDIA_SYM maybeSpace mediaList '{' maybeSpace block_ruleList save_block 0324 -- | MEDIA_SYM maybeSpace '{' maybeSpace block_ruleList save_block 0325 -- ; 0326 -- 0327 -- medium: 0328 -- IDENT maybeSpace 0329 -- ; 0330 -- 0331 -- keyframes: 0332 -- WEBKIT_KEYFRAMES_SYM maybeSpace keyframe_name maybeSpace '{' maybeSpace keyframes_rule '}' 0333 -- ; 0334 -- 0335 -- keyframe_name: 0336 -- IDENT 0337 -- | STRING 0338 -- ; 0339 -- 0340 -- keyframes_rule: 0341 -- /* empty */ 0342 -- | keyframes_rule keyframe_rule maybeSpace 0343 -- ; 0344 -- 0345 -- keyframe_rule: 0346 -- key_list maybeSpace '{' maybeSpace declaration_list '}' 0347 -- ; 0348 -- 0349 -- key_list: 0350 -- key 0351 -- | key_list maybeSpace ',' maybeSpace key 0352 -- ; 0353 -- 0354 -- key: 0355 -- PERCENTAGE 0356 -- | IDENT 0357 -- ; 0358 -- 0359 -- /* 0360 -- page: 0361 -- PAGE_SYM maybeSpace IDENT? pseudo_page? maybeSpace 0362 -- '{' maybeSpace declaration [ ';' maybeSpace declaration ]* '}' maybeSpace 0363 -- ; 0364 -- 0365 -- pseudo_page 0366 -- : ':' IDENT 0367 -- ; 0368 -- */ 0369 -- 0370 -- page: 0371 -- PAGE_SYM error invalid_block 0372 -- | PAGE_SYM error ';' 0373 -- ; 0374 -- 0375 -- font_face: 0376 -- FONT_FACE_SYM maybeSpace 0377 -- '{' maybeSpace declaration_list '}' maybeSpace 0378 -- | FONT_FACE_SYM error invalid_block 0379 -- | FONT_FACE_SYM error ';' 0380 -- ; 0381 -- 0382 -- combinator: 0383 -- '+' maybeSpace 0384 -- | '~' maybeSpace 0385 -- | '>' maybeSpace 0386 -- ; 0387 0388 MINUS 0389 | PLUS 0390 -> unaryOperator ;; 0391 0392 selectors=selectorList (lbrace=LBRACE | 0 [: reportProblem( Error, "Expected '{'" ); :]) maybeSpace declarations=declarationList 0393 ( rbrace=RBRACE 0394 | 0 [: reportProblem( Error, "Expected '}'" ); :]) 0395 -> ruleset ;; 0396 0397 --selector %prec UNIMPORTANT_TOK 0398 -- | selectorList ',' maybeSpace selector %prec UNIMPORTANT_TOK 0399 -- | selectorList error 0400 #selectors=selector 0401 @ (COMMA maybeSpace 0402 [: if(LA(1).kind == Token_LBRACE || LA(1).kind == Token_EOF) { 0403 reportProblem( Error, "Expected Selector" ); 0404 break;} 0405 :]) 0406 -> selectorList ;; 0407 0408 -- | selector combinator simpleSelector 0409 -- | selector error 0410 simpleSelector=simpleSelectorWithWhitespace+ 0411 -> selector ;; 0412 0413 simpleSelector=simpleSelector maybeSpace 0414 -> simpleSelectorWithWhitespace ;; 0415 0416 -- /* empty */ '|' 0417 -- | STAR '|' 0418 -- | IDENT '|' 0419 -- -> namespaceSelector ;; 0420 0421 element=elementName (specifier=specifierList | 0) 0422 | specifier=specifierList 0423 -- | namespace_selector elementName 0424 -- | namespace_selector elementName specifierList 0425 -- | namespace_selector specifierList 0426 -> simpleSelector ;; 0427 0428 ident=IDENT | star=STAR 0429 -> elementName ;; 0430 0431 (#specifiers=specifier)+ 0432 -> specifierList ;; 0433 0434 DOT ( className=IDENT | INVALID [: reportProblem( Error, "Invalid Token" ); :] ) 0435 | attrib=attrib 0436 | pseudo=pseudo 0437 | idSel=IDSEL 0438 -- | HEX 0439 -> specifier ;; 0440 0441 -- | LBRACKET maybeSpace namespace_selector IDENT maybeSpace RBRACKET 0442 -- | LBRACKET maybeSpace namespace_selector IDENT maybeSpace match maybeSpace identOrString maybeSpace RBRACKET 0443 LBRACKET 0444 maybeSpace attrName=IDENT maybeSpace 0445 (match=match maybeSpace ident=identOrString maybeSpace | 0) 0446 RBRACKET 0447 -> attrib ;; 0448 0449 EQUALS 0450 | INCLUDES 0451 | DASHMATCH 0452 | BEGINSWITH 0453 | ENDSWITH 0454 | CONTAINS 0455 -> match ;; 0456 0457 ident=IDENT 0458 | string=STRING 0459 -> identOrString ;; 0460 0461 COLON ( 0462 ident=IDENT 0463 | FUNCTION ( 0464 NTH --used by :nth-*(ax+b) 0465 | INTEGER --used by :nth-* 0466 | IDENT --used by :nth-*(odd/even) and :lang 0467 ) RPAREN 0468 | NOTFUNCTION maybeSpace simpleSelector maybeSpace RPAREN --used by :not 0469 | COLON ident=IDENT --used by ::selection (I guess) 0470 ) 0471 -> pseudo ;; 0472 0473 (#declarations=declaration)+ | 0 0474 -> declarationList ;; 0475 0476 -- variable_reference maybeSpace 0477 -- | 0478 -- property error 0479 -- | 0480 -- property ':' maybeSpace error expr prio { 0481 -- /* The default movable type template has letter-spacing: .none; Handle this by looking for 0482 -- error tokens at the start of an expr, recover the expr and then treat as an error, cleaning 0483 -- up and deleting the shifted expr. */ 0484 -- $$ = false; 0485 -- } 0486 -- | 0487 -- property ':' maybeSpace expr prio error { 0488 -- /* When we encounter something like p {color: red !important fail;} we should drop the declaration */ 0489 -- $$ = false; 0490 -- } 0491 -- | 0492 -- IMPORTANT_SYM maybeSpace { 0493 -- /* Handle this case: div { text-align: center; !important } Just reduce away the stray !important. */ 0494 -- $$ = false; 0495 -- } 0496 -- | 0497 -- property ':' maybeSpace { 0498 -- /* div { font-family: } Just reduce away this property with no value. */ 0499 -- $$ = false; 0500 -- } 0501 -- | 0502 -- property ':' maybeSpace error { 0503 -- /* if we come across rules with invalid values like this case: p { weight: *; }, just discard the rule */ 0504 -- $$ = false; 0505 -- } 0506 -- | 0507 -- property invalid_block { 0508 -- /* if we come across: div { color{;color:maroon} }, ignore everything within curly brackets */ 0509 -- $$ = false; 0510 -- } 0511 property=property 0512 (colon=COLON | 0 [: reportProblem( Error, "Expected Colon" ); :]) 0513 maybeSpace 0514 --don't parse next property as expr (happens if there is no expr and semicolon) 0515 [: if (LA(2).kind != Token_COLON && !(LA(2).kind == Token_WHITESPACE && LA(3).kind == Token_COLON)) { :] 0516 expr=expr prio 0517 (semicolon=SEMICOLON | 0 ) 0518 maybeSpace 0519 [: } :] 0520 -> declaration ;; 0521 0522 0523 maybeSpace ident=IDENT maybeSpace 0524 -> property ;; 0525 0526 IMPORTANT_SYM maybeSpace | 0 0527 -> prio ;; 0528 0529 0530 -- term+ as adding |0 to operator gives a conflict 0531 #terms=term+ @ operator 0532 | 0 [: reportProblem( Error, "Expected exprssion" ); :] 0533 -> expr ;; 0534 0535 DIVIDE maybeSpace 0536 | COMMA maybeSpace 0537 | EQUALS maybeSpace --non standard, for eg. filter: alpha(opacity=0); 0538 -> operator ;; 0539 0540 -- | '#' maybeSpace /* Handle error case: "color: #;" */ 0541 -- | variable_reference maybeSpace 0542 -- | '%' maybeSpace /* Handle width: %; */ 0543 string=STRING maybeSpace 0544 | ident=IDENT maybeSpace 0545 | (op=unaryOperator | 0) (term=unaryTerm | DIMEN) 0546 | uri=URI maybeSpace 0547 | unicoderange=UNICODERANGE maybeSpace 0548 | hexcolor=hexcolor 0549 | function=function -- /* FIXME: according to the specs a function can have a unaryOperator in front. I know no case where this makes sense */ 0550 -> term ;; 0551 0552 0553 value=INTEGER maybeSpace 0554 | value=FLOAT maybeSpace 0555 | value=PERCENTAGE maybeSpace 0556 | value=PXS maybeSpace 0557 | value=CMS maybeSpace 0558 | value=MMS maybeSpace 0559 | value=INS maybeSpace 0560 | value=PTS maybeSpace 0561 | value=PCS maybeSpace 0562 | value=DEGS maybeSpace 0563 | value=RADS maybeSpace 0564 | value=GRADS maybeSpace 0565 | value=MSECS maybeSpace 0566 | value=SECS maybeSpace 0567 | value=HERZ maybeSpace 0568 | value=KHERZ maybeSpace 0569 | value=EMS maybeSpace 0570 | value=QEMS maybeSpace 0571 | value=EXS maybeSpace 0572 -- | TURNS maybeSpace 0573 -- | REMS maybeSpace 0574 -> unaryTerm ;; 0575 0576 0577 -- variable_reference: 0578 -- VARCALL 0579 -- ; 0580 0581 FUNCTION maybeSpace expr RPAREN maybeSpace 0582 --| 0583 --FUNCTION maybeSpace error 0584 -> function ;; 0585 0586 0587 -- /* 0588 -- * There is a constraint on the color that it must 0589 -- * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F]) 0590 -- * after the "#"; e.g., "#000" is OK, but "#abcd" is not. 0591 -- */ 0592 HEXCOLOR maybeSpace 0593 -- | IDSEL maybeSpace 0594 -> hexcolor ;; 0595 0596 0597 0598 ----------------------------------------------------------------- 0599 -- Code segments copied to the implementation (.cpp) file. 0600 -- If existent, kdevelop-pg's current syntax requires this block 0601 -- to occur at the end of the file. 0602 ----------------------------------------------------------------- 0603 0604 [: 0605 0606 #include <KTextEditor/Range> 0607 #include <debug.h> 0608 #include "tokenizer.h" 0609 0610 namespace Css 0611 { 0612 0613 void Parser::tokenize(const QString& contents) 0614 { 0615 m_contents = contents; 0616 0617 Tokenizer tokenizer(tokenStream, contents.toLatin1().data()); 0618 0619 int kind = Parser::Token_EOF; 0620 do 0621 { 0622 kind = tokenizer.yylex(); 0623 0624 if ( !kind ) // when the lexer returns 0, the end of file is reached 0625 { 0626 kind = Parser::Token_EOF; 0627 } 0628 Parser::Token &t = tokenStream->push(); 0629 t.begin = tokenizer.tokenBegin(); 0630 t.end = tokenizer.tokenEnd(); 0631 t.kind = kind; 0632 //if ( m_debug ) qCDebug(KDEV_CSS) << kind << tokenText(t.begin,t.end) << t.begin << t.end; 0633 } 0634 while ( kind != Parser::Token_EOF ); 0635 0636 yylex(); // produce the look ahead token 0637 } 0638 0639 0640 QString Parser::tokenText(qint64 begin, qint64 end) 0641 { 0642 return m_contents.mid(begin,end-begin+1); 0643 } 0644 0645 0646 void Parser::reportProblem( Parser::ProblemType type, const QString& message ) 0647 { 0648 if (type == Error) 0649 qCDebug(KDEV_CSS) << "** ERROR:" << message; 0650 else if (type == Warning) 0651 qCWarning(KDEV_CSS) << "** WARNING:" << message; 0652 else if (type == Info) 0653 #if QT_VERSION >= 0x050500 0654 qCInfo(KDEV_CSS) << "** Info:" << message; 0655 #else 0656 qCDebug(KDEV_CSS) << "** Info:" << message; 0657 #endif 0658 0659 qint64 sLine; 0660 qint64 sCol; 0661 qint64 index = tokenStream->index()-1; 0662 tokenStream->startPosition(index, &sLine, &sCol); 0663 qint64 eLine; 0664 qint64 eCol; 0665 tokenStream->endPosition(index, &eLine, &eCol); 0666 KDevelop::Problem *p = new KDevelop::Problem(); 0667 p->setSource(KDevelop::IProblem::Parser); 0668 switch ( type ) { 0669 case Error: 0670 p->setSeverity(KDevelop::IProblem::Error); 0671 break; 0672 case Warning: 0673 p->setSeverity(KDevelop::IProblem::Warning); 0674 break; 0675 case Info: 0676 p->setSeverity(KDevelop::IProblem::Hint); 0677 break; 0678 } 0679 p->setDescription(message); 0680 p->setFinalLocation({m_currentDocument, KTextEditor::Range(sLine, sCol, eLine, eCol+1)}); 0681 m_problems << KDevelop::ProblemPointer(p); 0682 } 0683 0684 0685 // custom error recovery 0686 void Parser::expectedToken(int /*expected*/, qint64 /*where*/, const QString& name) 0687 { 0688 reportProblem( Parser::Error, QString("Expected token \"%1\"").arg(name)); 0689 } 0690 0691 void Parser::expectedSymbol(int /*expectedSymbol*/, const QString& name) 0692 { 0693 qint64 line; 0694 qint64 col; 0695 qint64 index = tokenStream->index()-1; 0696 Token &token = tokenStream->at(index); 0697 qCDebug(KDEV_CSS) << "token starts at:" << token.begin; 0698 qCDebug(KDEV_CSS) << "index is:" << index; 0699 tokenStream->startPosition(index, &line, &col); 0700 QString tokenValue = tokenText(token.begin, token.end); 0701 qint64 eLine; 0702 qint64 eCol; 0703 tokenStream->endPosition(index, &eLine, &eCol); 0704 reportProblem( Parser::Error, 0705 QString("Expected symbol \"%1\" (current token: \"%2\" [%3] at %4:%5 - %6:%7)") 0706 .arg(name) 0707 .arg(token.kind != 0 ? tokenValue : "EOF") 0708 .arg(token.kind) 0709 .arg(line) 0710 .arg(col) 0711 .arg(eLine) 0712 .arg(eCol)); 0713 } 0714 0715 void Parser::setDebug( bool debug ) 0716 { 0717 m_debug = debug; 0718 } 0719 0720 void Parser::setCurrentDocument(const KDevelop::IndexedString& url) 0721 { 0722 m_currentDocument = url; 0723 } 0724 0725 } // end of namespace Css 0726 0727 :] 0728 0729 -- kate: space-indent on; indent-width 4; tab-width 4; replace-tabs on; auto-insert-doxygen on