-- Lexical analysis for protect directive. -- Copyright (C) 2019 Tristan Gingold -- -- GHDL is free software; you can redistribute it and/or modify it under -- the terms of the GNU General Public License as published by the Free -- Software Foundation; either version 2, or (at your option) any later -- version. -- -- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY -- WARRANTY; without even the implied warranty of MERCHANTABILITY or -- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- for more details. -- -- You should have received a copy of the GNU General Public License -- along with GHDL; see the file COPYING. If not, write to the Free -- Software Foundation, 59 Temple Place - Suite 330, Boston, MA -- 02111-1307, USA. separate (Vhdl.Scanner) package body Directive_Protect is function Scan_Expression_List return Boolean; -- Scan/parse a keyword expression. -- Initial spaces must have been skipped. -- Return False in case of error. function Scan_Keyword_Expression return Boolean is begin if Characters_Kind (Source (Pos)) not in Letter then Error_Msg_Scan ("identifier expected in protect directive"); return False; end if; Scan_Identifier (False); if Current_Token /= Tok_Identifier then Error_Msg_Scan (+Get_Token_Location, "keyword must be an identifier"); return False; end if; Skip_Spaces; if Source (Pos) /= '=' then return True; end if; -- Eat '='. Pos := Pos + 1; Skip_Spaces; case Source (Pos) is when 'A' .. 'Z' | 'a' .. 'z' => Scan_Identifier (False); when '0' .. '9' => Scan_Literal; when '"' => Scan_String; when '(' => -- Eat '('. Pos := Pos + 1; Skip_Spaces; if not Scan_Expression_List then return False; end if; Skip_Spaces; if Source (Pos) /= ')' then Error_Msg_Scan ("')' expected at end of protect keyword list"); return False; end if; -- Eat ')'. Pos := Pos + 1; when others => -- Ok, we don't handle all the letters, nor extended identifiers. Error_Msg_Scan ("literal expected in protect tool directive"); return False; end case; return True; end Scan_Keyword_Expression; -- Scan: keyword_expression { , keyword_expression } function Scan_Expression_List return Boolean is begin loop if not Scan_Keyword_Expression then return False; end if; Skip_Spaces; if Source (Pos) /= ',' then return True; end if; -- Eat ','. Pos := Pos + 1; Skip_Spaces; end loop; end Scan_Expression_List; -- LRM08 24.1 Protect tool directives -- protect_directive ::= -- `PROTECT keyword_expression {, keyword_expression } procedure Scan_Protect_Directive is begin if Scan_Expression_List then if not Is_EOL (Source (Pos)) then Error_Msg_Scan ("end of line expected in protect directive"); end if; end if; Skip_Until_EOL; end Scan_Protect_Directive; end Directive_Protect; ='#n6'>6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82