CINXE.COM
EiffelLex Tutorial
<!doctype html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>EiffelLex Tutorial</title> <link media="all" rel="stylesheet" href="/theme/responsive-eiffel-org/css/all.css" /> <link rel="shortcut icon" href="https://www.eiffel.org/favicon.ico"/> <link href="https://fonts.googleapis.com/css?family=Inconsolata|Open+Sans:400,700|Titillium+Web" rel="stylesheet" type="text/css" /> <!--[if IE]><script src="/theme/responsive-eiffel-org/js/ie.js"></script><![endif]--> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <link rel="stylesheet" href="/module/auth/files/css/auth.css" type="text/css"/> <link rel="stylesheet" href="/module/node/files/css/node.css" type="text/css"/> <link rel="stylesheet" href="/module/blog/files/css/blog.css" type="text/css"/> <link rel="stylesheet" href="/module/comments/files/css/comments.css" type="text/css"/> <link rel="stylesheet" href="/module/wikitext/files/css/wikitext.css" type="text/css"/> <link rel="stylesheet" href="/module/taxonomy/files/css/taxonomy.css" type="text/css"/> <style> table.recent-changes th { padding: 3px; } table.recent-changes td { padding: 3px; border: dotted 1px #ddd; } table.recent-changes td.date { padding-left: 15px; } table.recent-changes td.title { font-weight: bold; } </style> <link rel="stylesheet" href="/module/feed_aggregator/files/css/feed_aggregator.css" type="text/css"/> <link rel="profile" href="http://gmpg.org/xfn/11" /> <meta property="url" content="https://www.eiffel.org/doc/solutions/EiffelLex_Tutorial" /> <meta property="og:type" content="article" /> <meta property="article:published_time" content="2025-02-11" /> <meta property="article:modified_time" content="2025-02-11" /> <meta property="og:image" content="https://www.eiffel.org/favicon.ico" /> <link rel='canonical' href='https://www.eiffel.org/doc/solutions/EiffelLex_Tutorial' /> <link rel='shortlink' href='https://www.eiffel.org/doc/solutions/EiffelLex_Tutorial' /> <script type="text/javascript" src="/module/wdocs/files/js/wdocs.js"></script> <link rel="stylesheet" href="/module/wdocs/files/css/wdocs.css" type="text/css"/> </head> <body class="page"> <div id="page"> <!-- Header --> <header id="header" class="grid-3"> <div class="logo"><a href="https://www.eiffel.org/"><img src="/theme/responsive-eiffel-org/images/logo.png" width="226" height="60" alt="Eiffel"></a></div> <nav id="nav"> <ul> <li><a href="https://www.eiffel.org/welcome">welcome</a></li> <li><a href="https://www.eiffel.org/documentation">documentation</a></li> <li><a href="https://www.eiffel.org/resources">resources</a></li> <li><a href="https://www.eiffel.org/contribute">contribute</a></li> <li><a href="https://www.eiffel.org/blogs">blogs</a></li> <li><a href="https://www.eiffel.org/downloads">download</a></li> </ul> </nav> <nav class="add-links"> <ul> <li> <a href="/account/roc-login?destination=doc%2Fsolutions%2FEiffelLex_Tutorial">Sign in</a> </li> <li class="search"> <div class="block" id="block-gcse_search_form"><div class="inside"><form class="search-form" method="GET" action="https://www.eiffel.org/gcse20"> <input type="image" alt="Search" class="btn" src="/theme/responsive-eiffel-org/images/ico-search.png"/> <input type="text" name="q" size="25" maxlength="255" value="" /> </form> </div></div> </li> </ul> </nav> </header> <!-- Main part --> <main id="main"> <a id="main-content"><!-- Internal anchor to top content --></a> <section id="content" class=" doc" itemtype="http://schema.org/Article" itemscope=""> <div class="container grid has-gutter"> <aside id="sidebar"> <div class="holder"><div class="block" id="block-wdocs-tree"><div class="inside"><div id="wdocs-tree" class="menu"><ul class="vertical" > <li class="expandable "><a href="/doc/eiffel/Eiffel">Eiffel</a><ul> <li class="expandable "><a href="/doc/eiffel/Eiffel_Overview">Overview</a><ul> <li><a href="/doc/eiffel/Two-Minute_fact_sheet">Two-Minute fact sheet</a></li><li><a href="/doc/eiffel/Your_next_project_in_Eiffel">Your next project in Eiffel</a></li><li><a href="/doc/eiffel/Learning_Eiffel">Learning Eiffel</a></li><li><a href="/doc/eiffel/Common_myths_and_misconceptions_about_Eiffel">Common myths and misconceptions about Eiffel</a></li></ul></li><li class="expandable "><a href="/doc/eiffel/Eiffel_Tutorials">Tutorials</a><ul> <li class="expandable "><a href="/doc/eiffel/Invitation_to_Eiffel_%28I2E%29">Invitation to Eiffel</a><ul> <li><a href="/doc/eiffel/I2E-_What_Must_I_Know_First%3F">I2E: What Must I Know First?</a></li><li><a href="/doc/eiffel/I2E-_Design_Principles">I2E: Design Principles</a></li><li><a href="/doc/eiffel/I2E-_Object-Oriented_Design">I2E: Object-Oriented Design</a></li><li><a href="/doc/eiffel/I2E-_Classes">I2E: Classes</a></li><li><a href="/doc/eiffel/I2E-_Types">I2E: Types</a></li><li><a href="/doc/eiffel/I2E-_Design_by_Contract_and_Assertions">I2E: Design by Contract and Assertions</a></li><li><a href="/doc/eiffel/I2E-_Exceptions">I2E: Exceptions</a></li><li><a href="/doc/eiffel/I2E-_Event-Driven_Programming_and_Agents">I2E: Event-Driven Programming and Agents</a></li><li><a href="/doc/eiffel/I2E-_Genericity">I2E: Genericity</a></li><li><a href="/doc/eiffel/I2E-_Inheritance">I2E: Inheritance</a></li><li><a href="/doc/eiffel/I2E-_Polymorphism_and_Dynamic_Binding">I2E: Polymorphism and Dynamic Binding</a></li><li><a href="/doc/eiffel/I2E-_Combining_Genericity_and_Inheritance">I2E: Combining Genericity and Inheritance</a></li><li><a href="/doc/eiffel/I2E-_Deferred_Classes_and_Seamless_Development">I2E: Deferred Classes and Seamless Development</a></li><li><a href="/doc/eiffel/I2E-_Putting_a_System_Together">I2E: Putting a System Together</a></li><li><a href="/doc/eiffel/I2E-_Invitation_to_Eiffel_Copyright">I2E: Invitation to Eiffel Copyright</a></li></ul></li><li class="expandable "><a href="/doc/eiffel/Mini_How-tos">Mini How-tos</a><ul> <li><a href="/doc/eiffel/Getting_a_STRING_from_a_NUMERIC_object">NUMERIC to STRING</a></li><li><a href="/doc/eiffel/Iterating_on_a_LIST">Iterating on a LIST</a></li><li><a href="/doc/eiffel/Removing_object_while_iterating_on_a_LIST">Removing object while iterating on a LIST</a></li><li><a href="/doc/eiffel/Managing_CTRL%2BC_in_console_application">Managing CTRL+C in console application</a></li></ul></li><li class="expandable "><a href="/doc/eiffel/An_Eiffel_Tutorial_%28ET%29">Tutorial</a><ul> <li><a href="/doc/eiffel/ET-_Overview">ET: Overview</a></li><li><a href="/doc/eiffel/ET-_General_Properties">ET: General Properties</a></li><li><a href="/doc/eiffel/ET-_The_Software_Process_in_Eiffel">ET: The Software Process in Eiffel</a></li><li><a href="/doc/eiffel/ET-_Hello_World">ET: Hello World</a></li><li><a href="/doc/eiffel/ET-_The_Static_Picture-_System_Organization">ET: The Static Picture: System Organization</a></li><li><a href="/doc/eiffel/ET-_The_Dynamic_Structure-_Execution_Model">ET: The Dynamic Structure: Execution Model</a></li><li><a href="/doc/eiffel/ET-_Genericity_and_Arrays">ET: Genericity and Arrays</a></li><li><a href="/doc/eiffel/ET-_Design_by_Contract_%28tm%29%2C_Assertions_and_Exceptions">ET: Design by Contract (tm), Assertions and Exceptions</a></li><li><a href="/doc/eiffel/ET-_Inheritance">ET: Inheritance</a></li><li><a href="/doc/eiffel/ET-_Instructions">ET: Instructions</a></li><li><a href="/doc/eiffel/ET-_Once_routines_and_shared_objects">ET: Once routines and shared objects</a></li><li><a href="/doc/eiffel/ET-_Other_Mechanisms">ET: Other Mechanisms</a></li><li><a href="/doc/eiffel/ET-_Agents">ET: Agents</a></li><li><a href="/doc/eiffel/ET-_Lexical_Conventions_and_Style_Rules">ET: Lexical Conventions and Style Rules</a></li><li><a href="/doc/eiffel/ET-_To_Learn_More">ET: To Learn More</a></li><li><a href="/doc/eiffel/ET-_Eiffel_Tutorial_Copyright">ET: Eiffel Tutorial Copyright</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffel/Language_reference">Language</a><ul> <li class="expandable "><a href="/doc/eiffel/Quick_reference_to_the_Eiffel_programming_language">Quick Reference</a><ul> <li><a href="/doc/eiffel/Eiffel_programming_language_syntax">Syntax</a></li><li class="expandable "><a href="/doc/eiffel/Expressions">Expressions</a><ul> <li><a href="/doc/eiffel/Conditional_expression">Conditional</a></li><li><a href="/doc/eiffel/Manifest_array">Manifest array</a></li></ul></li><li><a href="/doc/eiffel/Types">Types</a></li><li><a href="/doc/eiffel/Eiffel_programming_language_reserved_words">Reserved words</a></li></ul></li><li class="expandable "><a href="/doc/eiffel/Void-safe_programming_in_Eiffel">Void-safe programming</a><ul> <li><a href="/doc/eiffel/Void-safety-_Background%2C_definition%2C_and_tools">Background and tools</a></li><li><a href="/doc/eiffel/Creating_a_new_void-safe_project">New void-safe project</a></li><li class="expandable "><a href="/doc/eiffel/Converting_existing_software_to_void-safety">Converting existing software to void-safety</a><ul> <li><a href="/doc/eiffel/Void-safe_changes_to_Eiffel_libraries">Void-safe changes to Eiffel libraries</a></li><li><a href="/doc/eiffel/Mixing_void-safe_and_void-unsafe_software">Mixing void-safe and void-unsafe software</a></li></ul></li><li><a href="/doc/eiffel/What_makes_a_Certified_Attachment_Pattern">What makes a Certified Attachment Pattern</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffel/Technical_papers_about_Eiffel">Papers</a><ul> <li><a href="/doc/eiffel/Eiffel_as_an_expression_language">Eiffel as an expression language</a></li><li><a href="/doc/eiffel/Void-safety-_how_Eiffel_removes_null-pointer_dereferencing">Void-safety: how Eiffel removes null-pointer dereferencing</a></li><li class="expandable "><a href="/doc/eiffel/Books_about_the_Eiffel_Method_and_Language">Books</a><ul> <li><a href="/doc/eiffel/Touch_of_Class-_Learning_to_Program_Well_with_Objects_and_Contracts">Touch of Class</a></li><li><a href="/doc/eiffel/Object-Oriented_Software_Construction%2C_2nd_Edition">OOSC2</a></li><li><a href="/doc/eiffel/ECMA_Standard_367">ECMA Standard 367</a></li><li><a href="/doc/eiffel/Eiffel-_The_Language">Eiffel: The Language</a></li><li><a href="/doc/eiffel/Reusable_Software-_The_Base_Object-Oriented_Component_Libraries">OO Component Libraries</a></li><li><a href="/doc/eiffel/EiffelStudio-_A_Guided_Tour_-_Eiffel_Software_Technical_Report">EiffelStudio Guided Tour</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffel/Coding_Standards">Coding Standards</a><ul> <li><a href="/doc/eiffel/Eiffel_Code_Comments">Eiffel Code Comments</a></li><li><a href="/doc/eiffel/Eiffel_Coding_Standard">Eiffel Coding Standard</a></li><li><a href="/doc/eiffel/Local_Declaration_Guidelines">Local Declaration Guidelines</a></li><li><a href="/doc/eiffel/Style_Guidelines">Style Guidelines</a></li></ul></li><li class="expandable "><a href="/doc/eiffel/Examples">Examples</a><ul> <li><a href="/doc/eiffel/Introduction_to_the_Examples_Book">Introduction to the Examples Book</a></li><li><a href="/doc/eiffel/Example-_Command_line_arguments">Example: Command line arguments</a></li><li><a href="/doc/eiffel/Example-_Environment_variables">Example: Environment variables</a></li><li><a href="/doc/eiffel/Example-_File_IO">Example: File IO</a></li><li><a href="/doc/eiffel/Example-_Polymorphism">Example: Polymorphism</a></li><li><a href="/doc/eiffel/Example-_Reverse_a_string">Example: Reverse a string</a></li><li><a href="/doc/eiffel/Example-_Self-initializing_attributes_and_assigner_commands">Example: Self-initializing attributes and assigner commands</a></li><li><a href="/doc/eiffel/Example-_Sieve_of_Eratosthenes">Example: Sieve of Eratosthenes</a></li><li><a href="/doc/eiffel/Example-_Sleep">Example: Sleep</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio">EiffelStudio</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Getting_started">Getting started</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Setup_and_installation">Setup and installation</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Software_Installation_for_EiffelStudio">Software Installation for EiffelStudio</a><ul> <li><a href="/doc/eiffelstudio/FreeBSD">FreeBSD</a></li><li><a href="/doc/eiffelstudio/HP_OpenVMS">HP OpenVMS</a></li><li><a href="/doc/eiffelstudio/HP_Tru64_UNIX">HP Tru64 UNIX</a></li><li><a href="/doc/eiffelstudio/HP-UX">HP-UX</a></li><li><a href="/doc/eiffelstudio/Linux">Linux</a></li><li><a href="/doc/eiffelstudio/Mac_OS_X">Mac OS X</a></li><li><a href="/doc/eiffelstudio/OpenBSD">OpenBSD</a></li><li><a href="/doc/eiffelstudio/SGI_Irix">SGI Irix</a></li><li><a href="/doc/eiffelstudio/Solaris">Solaris</a></li><li class="expandable "><a href="/doc/eiffelstudio/Windows">Windows</a><ul> <li><a href="/doc/eiffelstudio/Installing_Microsoft_C_compiler">MS C compiler</a></li></ul></li></ul></li><li><a href="/doc/eiffelstudio/Third_Party_Tools_Installation_Help">Third Party Tools Installation Help</a></li></ul></li><li><a href="/doc/eiffelstudio/Introducing_EiffelStudio">Introducing EiffelStudio</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_tutorials">Tutorials</a><ul> <li><a href="/doc/eiffelstudio/Copying_the_Example_Files">Copying the Example Files</a></li><li><a href="/doc/eiffelstudio/Starting_EiffelStudio_and_Opening_a_Project">Starting EiffelStudio and Opening a Project</a></li><li><a href="/doc/eiffelstudio/Compiling_and_Executing_a_System">Compiling and Executing a System</a></li><li><a href="/doc/eiffelstudio/A_Look_at_the_Project_Directory">A Look at the Project Directory</a></li><li><a href="/doc/eiffelstudio/Starting_To_Browse">Starting To Browse</a></li><li><a href="/doc/eiffelstudio/Viewing_Classes">Viewing Classes</a></li><li><a href="/doc/eiffelstudio/Customizing_the_tools_layout_and_toolbars">Customizing the tools layout and toolbars</a></li><li><a href="/doc/eiffelstudio/Producing_and_Exporting_Documentation">Producing and Exporting Documentation</a></li><li><a href="/doc/eiffelstudio/Browsing_Features">Browsing Features</a></li><li><a href="/doc/eiffelstudio/Retargeting_Through_Pick-and-Drop">Retargeting Through Pick-and-Drop</a></li><li><a href="/doc/eiffelstudio/Recompiling_and_Editing">Recompiling and Editing</a></li><li><a href="/doc/eiffelstudio/Handling_Syntax_and_Validity_Errors">Handling Syntax and Validity Errors</a></li><li><a href="/doc/eiffelstudio/Debugging_and_Run-time_Monitoring">Debugging and Run-time Monitoring</a></li><li class="expandable "><a href="/doc/eiffelstudio/Using_AutoTest">Using AutoTest</a><ul> <li><a href="/doc/eiffelstudio/Testing-_Background_and_basics">Testing: Background and basics</a></li><li><a href="/doc/eiffelstudio/Create_a_manual_test">Create a manual test</a></li><li><a href="/doc/eiffelstudio/Execute_tests">Execute tests</a></li><li><a href="/doc/eiffelstudio/Using_extracted_tests">Using extracted tests</a></li><li><a href="/doc/eiffelstudio/Using_generated_tests">Using generated tests</a></li><li><a href="/doc/eiffelstudio/Managing_tests">Managing tests</a></li></ul></li><li><a href="/doc/eiffelstudio/Computing_Project_Metrics">Computing Project Metrics</a></li><li><a href="/doc/eiffelstudio/Graphics-based_Design">Graphics-based Design</a></li><li><a href="/doc/eiffelstudio/Using_automatic_class_licensing">Using automatic class licensing</a></li><li><a href="/doc/eiffelstudio/How_EiffelStudio_Compiles">How EiffelStudio Compiles</a></li><li><a href="/doc/eiffelstudio/Technical_papers_about_EiffelStudio">Papers</a></li><li><a href="/doc/eiffelstudio/The_Command-Line_Compiler">The Command-Line Compiler</a></li><li><a href="/doc/eiffelstudio/Executing_a_System_Within_and_Without_EiffelStudio">Executing a System Within and Without EiffelStudio</a></li><li><a href="/doc/eiffelstudio/Writing_Documentation_Filters_with_EFF%2C_the_Eiffel_Filter_Format">Writing Filters with EFF</a></li><li><a href="/doc/eiffelstudio/Manual_identification_and_copyright">Manual identification and copyright</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_Reference">Reference</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_release_notes">Release Notes</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_24.05">24.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_23.09">23.09</a></li><li class="expandable "><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_22.12">22.12</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_22.12_-_macosx">22.12 - macosx</a></li></ul></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_22.05">22.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_21.11">21.11</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_20.11">20.11</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_20.05">20.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_19.12">19.12</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_19.05">19.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_18.11">18.11</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_18.07">18.07</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_18.01">18.01</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_17.05">17.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_17.01">17.01</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_16.05">16.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_15.12">15.12</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_15.08">15.08</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_15.01">15.01</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_14.05">14.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_13.11">13.11</a></li><li class="expandable "><a href="/doc/eiffelstudio/7.x">7.x</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_7.3">7.3</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_7.2">7.2</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_7.1">7.1</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_7.0">7.0</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_6_release_notes">6.x</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.8">6.8</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.7">6.7</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.6">6.6</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.5">6.5</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.4">6.4</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.3">6.3</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.2">6.2</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.1">6.1</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.0">6.0</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_5_release_notes">5.x</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.7">5.7</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.6">5.6</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.5">5.5</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.4">5.4</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.3">5.3</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.2">5.2</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.1">5.1</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.0">5.0</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio-_General_interface_description">General Description</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_interface_mechanisms">EiffelStudio interface mechanisms</a><ul> <li><a href="/doc/eiffelstudio/Pick-and-drop_mechanism">Pick-and-drop mechanism</a></li><li><a href="/doc/eiffelstudio/Pick-and-drop_shortcut">Pick-and-drop shortcut</a></li><li><a href="/doc/eiffelstudio/Toolbar_customization">Toolbar customization</a></li></ul></li><li><a href="/doc/eiffelstudio/EiffelStudio-_All_shortcuts">EiffelStudio: All shortcuts</a></li><li><a href="/doc/eiffelstudio/EiffelStudio_window_overview">EiffelStudio window overview</a></li><li><a href="/doc/eiffelstudio/Main_toolbars">Main toolbars</a></li><li><a href="/doc/eiffelstudio/EiffelStudio-_Key_shortcuts">EiffelStudio: Key shortcuts</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Browsing_tools">Browsing tools</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Address_bars">Address bars</a><ul> <li><a href="/doc/eiffelstudio/Main_address_bar">Main address bar</a></li><li><a href="/doc/eiffelstudio/Context_tool_address_bar">Context tool address bar</a></li><li><a href="/doc/eiffelstudio/Change_data_share_mode">Change data share mode</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Groups_tool">Groups tool</a><ul> <li><a href="/doc/eiffelstudio/System_tree_representation">System tree representation</a></li><li><a href="/doc/eiffelstudio/New_cluster_command">New cluster command</a></li><li><a href="/doc/eiffelstudio/New_class_command">New class command</a></li><li><a href="/doc/eiffelstudio/Locate_command">Locate command</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Features_tool">Features tool</a><ul> <li><a href="/doc/eiffelstudio/Feature_tree">Feature tree</a></li><li><a href="/doc/eiffelstudio/New_feature_command">New feature command</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Favorites_tool">Favorites tool</a><ul> <li><a href="/doc/eiffelstudio/Favorites_tree">Favorites tree</a></li><li><a href="/doc/eiffelstudio/Favorites_menu">Favorites menu</a></li><li class="expandable "><a href="/doc/eiffelstudio/Organize_Favorites_dialog">Organize Favorites dialog</a><ul> <li><a href="/doc/eiffelstudio/New_favorite_class_command">New favorite class command</a></li><li><a href="/doc/eiffelstudio/Create_favorite_folder_command">Create favorite folder command</a></li><li><a href="/doc/eiffelstudio/Move_to_Folder_command">Move to Folder command</a></li><li><a href="/doc/eiffelstudio/Remove_favorite_command">Remove favorite command</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Windows_tool">Windows tool</a><ul> <li><a href="/doc/eiffelstudio/Window_list">Window list</a></li><li><a href="/doc/eiffelstudio/Window_menu">Window menu</a></li><li><a href="/doc/eiffelstudio/Window_related_commands">Window related commands</a></li></ul></li><li><a href="/doc/eiffelstudio/Search_tool">Search tool</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_Editor">Editor</a><ul> <li><a href="/doc/eiffelstudio/Cursor_moves">Cursor moves</a></li><li><a href="/doc/eiffelstudio/Selection">Selection</a></li><li><a href="/doc/eiffelstudio/Clipboard_functionality">Clipboard functionality</a></li><li><a href="/doc/eiffelstudio/History_functionality">History functionality</a></li><li><a href="/doc/eiffelstudio/Search_functionality">Search functionality</a></li><li class="expandable "><a href="/doc/eiffelstudio/Automatic_completion">Automatic completion</a><ul> <li><a href="/doc/eiffelstudio/Syntax_auto_complete">Syntax auto complete</a></li><li><a href="/doc/eiffelstudio/Feature_call_auto_complete">Feature call auto complete</a></li><li><a href="/doc/eiffelstudio/Class_name_auto_complete">Class name auto complete</a></li></ul></li><li><a href="/doc/eiffelstudio/Code_Templates">Code Templates</a></li><li class="expandable "><a href="/doc/eiffelstudio/Operations_on_text_blocks">Operations on text blocks</a><ul> <li><a href="/doc/eiffelstudio/Comment_and_uncomment_lines">Comment and uncomment lines</a></li><li><a href="/doc/eiffelstudio/Indent_and_unindent_selection">Indent and unindent selection</a></li><li><a href="/doc/eiffelstudio/Embed_lines_in_%27if_then...end%27_or_in_%27debug...end%27">Embed lines in 'if then...end' or in 'debug...end'</a></li></ul></li><li><a href="/doc/eiffelstudio/Edit_menu_commands">Edit menu commands</a></li><li><a href="/doc/eiffelstudio/Editor_customization">Editor customization</a></li></ul></li><li><a href="/doc/eiffelstudio/Contract_Editor_tool">Contract Editor tool</a></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio-_Project_settings_window">Project Settings</a><ul> <li><a href="/doc/eiffelstudio/System_Options">System Options</a></li><li class="expandable "><a href="/doc/eiffelstudio/General_Target_Options">General Target Options</a><ul> <li><a href="/doc/eiffelstudio/Language_and_Capabilities">Language and Capabilities</a></li><li><a href="/doc/eiffelstudio/Assertion_Options">Assertion Options</a></li><li><a href="/doc/eiffelstudio/Group_Options">Group Options</a></li><li class="expandable "><a href="/doc/eiffelstudio/Advanced_Options">Advanced Options</a><ul> <li><a href="/doc/eiffelstudio/Warning_Options">Warning Options</a></li><li><a href="/doc/eiffelstudio/Debug_Options">Debug Options</a></li><li><a href="/doc/eiffelstudio/Externals_Options">Externals Options</a></li><li><a href="/doc/eiffelstudio/Tasks_Options">Tasks Options</a></li><li><a href="/doc/eiffelstudio/Variables">Variables</a></li><li><a href="/doc/eiffelstudio/Type_mapping">Type mapping</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Compiler">Compiler</a><ul> <li><a href="/doc/eiffelstudio/Melting_Ice_Technology">Melting Ice Technology</a></li><li><a href="/doc/eiffelstudio/Supported_C_compilers">Supported C compilers</a></li><li class="expandable "><a href="/doc/eiffelstudio/Command_line">Command line</a><ul> <li><a href="/doc/eiffelstudio/Eiffel_compatibility_options">Eiffel compatibility options</a></li><li><a href="/doc/eiffelstudio/EiffelStudio-_Using_command_line_options">Using command line options</a></li><li><a href="/doc/eiffelstudio/Batch_compilation">Batch compilation</a></li><li class="expandable "><a href="/doc/eiffelstudio/Command_line_interactive_mode">Command line interactive mode</a><ul> <li><a href="/doc/eiffelstudio/Compile_%28and_run%29_menu">Compile (and run) menu</a></li><li><a href="/doc/eiffelstudio/Class_menu">Class menu</a></li><li><a href="/doc/eiffelstudio/Feature_menu">Feature menu</a></li><li><a href="/doc/eiffelstudio/System_menu">System menu</a></li><li><a href="/doc/eiffelstudio/Testing_menu">Testing menu</a></li><li><a href="/doc/eiffelstudio/Profile_menu">Profile menu</a></li><li><a href="/doc/eiffelstudio/Documentation_menu">Documentation menu</a></li></ul></li><li><a href="/doc/eiffelstudio/finish_freezing_utility">finish_freezing utility</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Dynamic_library_generation">Dynamic library generation</a><ul> <li><a href="/doc/eiffelstudio/Dynamic_library_builder">Dynamic library builder</a></li><li><a href="/doc/eiffelstudio/Definition_file">Definition file</a></li><li><a href="/doc/eiffelstudio/Dynamic_library-_Generated_files">Dynamic library: Generated files</a></li></ul></li><li><a href="/doc/eiffelstudio/Syntax_level_variant_settings_by_version">Syntax level variant settings by version</a></li><li><a href="/doc/eiffelstudio/Differences_between_standard_ECMA-367_and_Eiffel_Software_implementation">ECMA-367 vs implementation</a></li><li><a href="/doc/eiffelstudio/Differences_between_ETL_2nd_printing_and__Eiffel_Software__implementation">ETL 2nd printing vs implementation</a></li><li class="expandable "><a href="/doc/eiffelstudio/Compiler_History">Compiler History</a><ul> <li><a href="/doc/eiffelstudio/Major_changes_with_ISE_Eiffel_18.01_and_18.07">18.07</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_15.12_and_ISE_Eiffel_16.05">16.05</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_15.08_and_ISE_Eiffel_15.12">15.12</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_15.01_and_ISE_Eiffel_15.08">15.08</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_13.11_and_ISE_Eiffel_14.05">14.05</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_7.3_and_ISE_Eiffel_13.11">13.11</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_7.2_and_ISE_Eiffel_7.3">7.3</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_7.1_and_ISE_Eiffel_7.2">7.2</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_7.0_and_ISE_Eiffel_7.1">7.1</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.8_and_ISE_Eiffel_7.0">7.0</a></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_6_compiler_history">6.x</a><ul> <li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.7_and_ISE_Eiffel_6.8">6.8</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.6_and_ISE_Eiffel_6.7">6.7</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.5_and_ISE_Eiffel_6.6">6.6</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.4_and_ISE_Eiffel_6.5">6.5</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.3_and_ISE_Eiffel_6.4">6.4</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.2_and_ISE_Eiffel_6.3">6.3</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.1_and_ISE_Eiffel_6.2">6.2</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.0_and_ISE_Eiffel_6.1">6.1</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.7_and_ISE_Eiffel_6.0">6.0</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_5_compiler_history">5.x</a><ul> <li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.6_and_ISE_Eiffel_5.7">5.7</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.5_and_ISE_Eiffel_5.6">5.6</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.4_and_ISE_Eiffel_5.5">5.5</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.3_and_ISE_Eiffel_5.4">5..4</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.2_and_ISE_Eiffel_5.3">5.3</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.1_and_ISE_Eiffel_5.2">5.2</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.0_and_ISE_Eiffel_5.1">5.1</a></li><li class="expandable "><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_4.5_and_ISE_Eiffel_5.0">5.0</a><ul> <li><a href="/doc/eiffelstudio/Assertions_checking_configuration_changes">Assertions checking configuration changes</a></li><li><a href="/doc/eiffelstudio/EiffelThread_differences_from_4.5_to_5.0">EiffelThread differences from 4.5 to 5.0</a></li><li><a href="/doc/eiffelstudio/Compiler_differences_from_4.5_to_5.0">Compiler differences from 4.5 to 5.0</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Errors_and_warnings">Errors, warnings</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Legacy_code">Legacy code</a><ul> <li><a href="/doc/eiffelstudio/VD81">VD81</a></li><li><a href="/doc/eiffelstudio/VWMA%281%29">VWMA(1)</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Code_Analyzer">Code Analyzer</a><ul> <li><a href="/doc/eiffelstudio/Getting_Started">Getting Started</a></li><li><a href="/doc/eiffelstudio/Running_the_Code_Analyzer">Running the Analyzer</a></li><li><a href="/doc/eiffelstudio/Code_Analyzer-_Interpreting_Results">Interpreting Results</a></li><li><a href="/doc/eiffelstudio/Code_Analyzer-_Customization">Customization</a></li><li class="expandable "><a href="/doc/eiffelstudio/Code_Analyzer-_Rules">Rules</a><ul> <li><a href="/doc/eiffelstudio/CA001_-_Self_Assignment">CA001</a></li><li><a href="/doc/eiffelstudio/CA002_-_Unused_argument">CA002</a></li><li><a href="/doc/eiffelstudio/CA003_-_Feature_never_called">CA003</a></li><li><a href="/doc/eiffelstudio/CA004_-_Command-Query_Separation">CA004</a></li><li><a href="/doc/eiffelstudio/CA005_-_Useless_object_test_local">CA005</a></li><li><a href="/doc/eiffelstudio/CA006_-_Object_test_typing_not_needed">CA006</a></li><li><a href="/doc/eiffelstudio/CA010_-_High_complexity_of_nested_branches_and_loops">CA010</a></li><li><a href="/doc/eiffelstudio/CA011_-_Too_many_arguments">CA011</a></li><li><a href="/doc/eiffelstudio/CA013_-_Exported_creation_procedure">CA013</a></li><li><a href="/doc/eiffelstudio/CA017_-_Empty_conditional">CA017</a></li><li><a href="/doc/eiffelstudio/CA020_-_Variable_not_read_after_assignment">CA020</a></li><li><a href="/doc/eiffelstudio/CA023_-_Unneeded_parentheses">CA023</a></li><li><a href="/doc/eiffelstudio/CA024_-_Use_across_loop">CA024</a></li><li><a href="/doc/eiffelstudio/CA025_-_Use_semicolons">CA025</a></li><li><a href="/doc/eiffelstudio/CA028_-_Combine_two_if_instructions">CA028</a></li><li><a href="/doc/eiffelstudio/CA032_-_Long_routine_implementation">CA032</a></li><li><a href="/doc/eiffelstudio/CA033_-_Large_class">CA033</a></li><li><a href="/doc/eiffelstudio/CA034_-_High_NPATH_complexity">CA034</a></li><li><a href="/doc/eiffelstudio/CA071_-_Self-comparison">CA071</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Debugger">Debugger</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Execution_commands">Execution commands</a><ul> <li><a href="/doc/eiffelstudio/Run_and_stop_at_breakpoints">Run and stop at breakpoints</a></li><li><a href="/doc/eiffelstudio/Run_with_arguments">Run with arguments</a></li><li><a href="/doc/eiffelstudio/Execution_profiles">Execution profiles</a></li><li><a href="/doc/eiffelstudio/Run_without_breakpoints">Run without breakpoints</a></li><li><a href="/doc/eiffelstudio/Run_a_finalized_executable">Run a finalized executable</a></li><li><a href="/doc/eiffelstudio/Step_into_a_feature">Step into a feature</a></li><li><a href="/doc/eiffelstudio/Execute_one_line_at_a_time">Execute one line at a time</a></li><li><a href="/doc/eiffelstudio/Step_out_of_a_feature">Step out of a feature</a></li><li><a href="/doc/eiffelstudio/Pause_an_application">Pause an application</a></li><li><a href="/doc/eiffelstudio/Stop_a_debugged_application">Stop a debugged application</a></li><li><a href="/doc/eiffelstudio/Attach_application">Attach application</a></li><li><a href="/doc/eiffelstudio/Detach_application">Detach application</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Breakpoints">Breakpoints</a><ul> <li><a href="/doc/eiffelstudio/Breakpoint_editing">Breakpoint editing</a></li><li><a href="/doc/eiffelstudio/Breakpoint_commands">Breakpoint commands</a></li><li><a href="/doc/eiffelstudio/Breakpoint_information_command">Breakpoint information command</a></li><li><a href="/doc/eiffelstudio/Breakpoint_menu">Breakpoint menu</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Call_stack_tool">Call stack tool</a><ul> <li><a href="/doc/eiffelstudio/Call_stack_tool-_Interface">Call stack tool: Interface</a></li><li><a href="/doc/eiffelstudio/Information_relative_to_a_stack_element">Information relative to a stack element</a></li><li><a href="/doc/eiffelstudio/Supported_exceptions">Supported exceptions</a></li><li><a href="/doc/eiffelstudio/Save_call_stack">Save call stack</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Execution_record_and_replay">Execution record and replay</a><ul> <li><a href="/doc/eiffelstudio/Record_execution">Record execution</a></li><li><a href="/doc/eiffelstudio/Replay_%28recorded%29_execution">Replay (recorded) execution</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Object_tool">Object tool</a><ul> <li><a href="/doc/eiffelstudio/Attribute_symbols">Attribute symbols</a></li><li><a href="/doc/eiffelstudio/Debug_output">Debug output</a></li><li><a href="/doc/eiffelstudio/Set_slice_size_command">Set slice size command</a></li><li><a href="/doc/eiffelstudio/Object_Viewer_%28also_known_as_Expanded_display%29">Object Viewer (also known as Expanded display)</a></li><li><a href="/doc/eiffelstudio/Remove_object_command">Remove object command</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Expression_evaluation">Expression evaluation</a><ul> <li><a href="/doc/eiffelstudio/Evaluation_tool_or_Watch_tool">Evaluation tool or Watch tool</a></li><li><a href="/doc/eiffelstudio/New_expression_dialog">New expression dialog</a></li></ul></li><li><a href="/doc/eiffelstudio/Debuggee%27s_Object_Storage">Debuggee's Object Storage</a></li><li><a href="/doc/eiffelstudio/Threads_tool">Threads tool</a></li><li><a href="/doc/eiffelstudio/Exceptions_handling_tool">Exceptions handling tool</a></li><li><a href="/doc/eiffelstudio/Stack_overflow_prevention">Stack overflow prevention</a></li><li><a href="/doc/eiffelstudio/Debugging_tips_with_the_objects_grid_view">Debugging tips with the objects grid view</a></li><li><a href="/doc/eiffelstudio/Debugging_preferences">Debugging preferences</a></li><li><a href="/doc/eiffelstudio/Command_line_debugger">Command line debugger</a></li><li><a href="/doc/eiffelstudio/Debugging_limitations">Debugging limitations</a></li></ul></li><li><a href="/doc/eiffelstudio/Error_List_Tool">Error List Tool</a></li><li class="expandable "><a href="/doc/eiffelstudio/Diagram_tool">Diagram tool</a><ul> <li><a href="/doc/eiffelstudio/Notation">Notation</a></li><li><a href="/doc/eiffelstudio/Diagram_toolbar">Diagram toolbar</a></li><li><a href="/doc/eiffelstudio/Views">Views</a></li><li><a href="/doc/eiffelstudio/Contexts">Contexts</a></li><li><a href="/doc/eiffelstudio/Diagram_tool-_Code_generation">Diagram tool: Code generation</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Metrics_tool">Metrics tool</a><ul> <li><a href="/doc/eiffelstudio/Requirements">Requirements</a></li><li class="expandable "><a href="/doc/eiffelstudio/Definitions">Definitions</a><ul> <li><a href="/doc/eiffelstudio/Attributes%2C_metrics_and_measures">Attributes, metrics and measures</a></li><li><a href="/doc/eiffelstudio/Units">Units</a></li><li><a href="/doc/eiffelstudio/Metric_framework_and_theory">Metric framework and theory</a></li><li><a href="/doc/eiffelstudio/Elementary_and_composite_metrics">Elementary and composite metrics</a></li><li><a href="/doc/eiffelstudio/Raw_metrics_and_selection_criteria">Raw metrics and selection criteria</a></li><li><a href="/doc/eiffelstudio/Selection_Criteria">Selection Criteria</a></li><li><a href="/doc/eiffelstudio/Predefined_raw_metrics">Predefined raw metrics</a></li><li><a href="/doc/eiffelstudio/Scopes">Scopes</a></li><li><a href="/doc/eiffelstudio/Domains">Domains</a></li><li><a href="/doc/eiffelstudio/Measurement_archive">Measurement archive</a></li><li><a href="/doc/eiffelstudio/Under_the_Hood_-_How_metrics_work">Under the Hood - How metrics work</a></li><li><a href="/doc/eiffelstudio/Criterion_References">Criterion References</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/User_interface_basics">User interface basics</a><ul> <li><a href="/doc/eiffelstudio/Metric_Evaluation_Panel">Metric Evaluation Panel</a></li><li><a href="/doc/eiffelstudio/Detailed_Result_Panel">Detailed Result Panel</a></li><li><a href="/doc/eiffelstudio/Metric_Definition_Panel">Metric Definition Panel</a></li><li><a href="/doc/eiffelstudio/Metric_History_Panel">Metric History Panel</a></li><li><a href="/doc/eiffelstudio/Metric_Archive_Panel">Metric Archive Panel</a></li></ul></li></ul></li><li><a href="/doc/eiffelstudio/Console_tool">Console tool</a></li><li class="expandable "><a href="/doc/eiffelstudio/Outputs_tool">Outputs tool</a><ul> <li><a href="/doc/eiffelstudio/General_output_pane">General output pane</a></li><li><a href="/doc/eiffelstudio/External_compilation_pane">External compilation pane</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Eiffel_Information_System">Eiffel Information System</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/EIS-_Outgoing">EIS: Outgoing</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Information_Tool">Information Tool</a><ul> <li><a href="/doc/eiffelstudio/Browsing_Information">Browsing Information</a></li><li><a href="/doc/eiffelstudio/Change_Analysis">Change Analysis</a></li><li><a href="/doc/eiffelstudio/Annotation_Management">Annotation Management</a></li><li><a href="/doc/eiffelstudio/Protocols">Protocols</a></li><li><a href="/doc/eiffelstudio/Variable_Definition">Variable Definition</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EIS-_Incoming">EIS: Incoming</a><ul> <li><a href="/doc/eiffelstudio/Eiffel_Scheme_Syntax">Eiffel Scheme Syntax</a></li><li><a href="/doc/eiffelstudio/EIS_incoming_Examples">EIS incoming Examples</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/AutoTest">AutoTest</a><ul> <li><a href="/doc/eiffelstudio/The_AutoTest_Interface">The AutoTest Interface</a></li><li><a href="/doc/eiffelstudio/The_Eiffel_Test_Wizard">The Eiffel Test Wizard</a></li></ul></li><li><a href="/doc/eiffelstudio/Source_Control_Management">Source Control</a></li><li class="expandable "><a href="/doc/eiffelstudio/Wizards_and_dialogs">Wizards and dialogs</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Profiler_Wizard">Profiler Wizard</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Profiler_wizard_guided_tour">Profiler wizard guided tour</a><ul> <li><a href="/doc/eiffelstudio/Select_the_Compilation_mode">Select the Compilation mode</a></li><li><a href="/doc/eiffelstudio/Reuse_or_Generate_an_Execution_Profile">Reuse or Generate an Execution Profile</a></li><li><a href="/doc/eiffelstudio/Select_a_Run-time_information_record_to_generate_the_Execution_Profile">Select a Run-time information record to generate the Execution Profile</a></li><li><a href="/doc/eiffelstudio/Select_the_information_you_need_and_formulate_your_query">Select the information you need and formulate your query</a></li><li><a href="/doc/eiffelstudio/Profile_query_window">Profile query window</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Profiler_How_To%27s">Profiler How To's</a><ul> <li><a href="/doc/eiffelstudio/How_to_set_up_a_Profiler_Configuration_File">How to set up a Profiler Configuration File</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Dialogs">Dialogs</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/New_feature_dialog">New feature dialog</a><ul> <li><a href="/doc/eiffelstudio/New_feature_dialog_overview">New feature dialog overview</a></li><li><a href="/doc/eiffelstudio/New_procedure_layout">New procedure layout</a></li><li><a href="/doc/eiffelstudio/New_function_layout">New function layout</a></li><li><a href="/doc/eiffelstudio/New_attribute_layout">New attribute layout</a></li><li class="expandable "><a href="/doc/eiffelstudio/New_feature_dialog-_feature_properties_modification">New feature dialog: feature properties modification</a><ul> <li><a href="/doc/eiffelstudio/Feature_clauses">Feature clauses</a></li><li><a href="/doc/eiffelstudio/Name_field">Name field</a></li><li><a href="/doc/eiffelstudio/Argument_list">Argument list</a></li><li><a href="/doc/eiffelstudio/Header_comment">Header comment</a></li><li><a href="/doc/eiffelstudio/Precondition">Precondition</a></li><li><a href="/doc/eiffelstudio/Local_variable">Local variable</a></li><li><a href="/doc/eiffelstudio/Feature_body">Feature body</a></li><li><a href="/doc/eiffelstudio/Postcondition">Postcondition</a></li><li><a href="/doc/eiffelstudio/Type_selection">Type selection</a></li><li><a href="/doc/eiffelstudio/Invariant_field">Invariant field</a></li><li><a href="/doc/eiffelstudio/Set-procedure">Set-procedure</a></li></ul></li></ul></li><li><a href="/doc/eiffelstudio/Error_wizard">Error wizard</a></li><li><a href="/doc/eiffelstudio/External_commands_editor_dialog">External commands editor dialog</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_Preferences">EiffelStudio Preferences</a><ul> <li><a href="/doc/eiffelstudio/Preference_window_overview">Preference window overview</a></li><li class="expandable "><a href="/doc/eiffelstudio/Preferences_Reference">Preferences Reference</a><ul> <li><a href="/doc/eiffelstudio/General_Preferences">General Preferences</a></li><li class="expandable "><a href="/doc/eiffelstudio/Interface">Interface</a><ul> <li><a href="/doc/eiffelstudio/Development_Window_Preferences">Development Window Preferences</a></li><li><a href="/doc/eiffelstudio/Discardable_dialogs">Discardable dialogs</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_Tools_Preferences">EiffelStudio Tools Preferences</a><ul> <li><a href="/doc/eiffelstudio/Context_Tools">Context Tools</a></li><li><a href="/doc/eiffelstudio/EiffelStudio_Diagram_Tool_Preferences">EiffelStudio Diagram Tool Preferences</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Editor_Preferences">Editor Preferences</a><ul> <li><a href="/doc/eiffelstudio/General_Editor_Preferences">General Editor Preferences</a></li><li class="expandable "><a href="/doc/eiffelstudio/Eiffel_Editor_Preferences">Eiffel Editor Preferences</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Syntax_automatic_completion_preferences">Syntax automatic completion preferences</a><ul> <li><a href="/doc/eiffelstudio/Keywords_automatic_completion_preferences">Keywords automatic completion preferences</a></li><li><a href="/doc/eiffelstudio/Keyword_completion_customization">Keyword completion customization</a></li><li><a href="/doc/eiffelstudio/Default_values_for_keyword_completion_preferences">Default values for keyword completion preferences</a></li></ul></li></ul></li><li><a href="/doc/eiffelstudio/Keyboard_shortcuts_preferences">Keyboard shortcuts preferences</a></li></ul></li><li><a href="/doc/eiffelstudio/Debugger_Preferences">Debugger Preferences</a></li><li><a href="/doc/eiffelstudio/Recent_Project_Preferences">Recent Project Preferences</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Formatted_information_about_compiled_classes_and_features">Formatted information about compiled classes and features</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Class_views">Class views</a><ul> <li><a href="/doc/eiffelstudio/Class_formatters-_Basic_text_view">Class formatters: Basic text view</a></li><li><a href="/doc/eiffelstudio/Clickable_view">Clickable view</a></li><li><a href="/doc/eiffelstudio/Class_formatters-_Flat_view">Class formatters: Flat view</a></li><li><a href="/doc/eiffelstudio/Contract_view">Contract view</a></li><li><a href="/doc/eiffelstudio/Flat_Contract_view">Flat Contract view</a></li><li><a href="/doc/eiffelstudio/Ancestors">Ancestors</a></li><li><a href="/doc/eiffelstudio/Descendants">Descendants</a></li><li><a href="/doc/eiffelstudio/Clients">Clients</a></li><li><a href="/doc/eiffelstudio/Suppliers">Suppliers</a></li><li><a href="/doc/eiffelstudio/Attributes">Attributes</a></li><li><a href="/doc/eiffelstudio/Routines">Routines</a></li><li><a href="/doc/eiffelstudio/Invariants">Invariants</a></li><li><a href="/doc/eiffelstudio/Creators">Creators</a></li><li><a href="/doc/eiffelstudio/Deferred_features">Deferred features</a></li><li><a href="/doc/eiffelstudio/Once_routines_and_constants">Once routines and constants</a></li><li><a href="/doc/eiffelstudio/Class_formatters-_External_features">Class formatters: External features</a></li><li><a href="/doc/eiffelstudio/Exported_features">Exported features</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Feature_views">Feature views</a><ul> <li><a href="/doc/eiffelstudio/Feature_formatters-_Basic_text_view">Feature formatters: Basic text view</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Flat_view">Feature formatters: Flat view</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Callers">Feature formatters: Callers</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Assigners">Feature formatters: Assigners</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Creators">Feature formatters: Creators</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Callees">Feature formatters: Callees</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Assignees">Feature formatters: Assignees</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Creations">Feature formatters: Creations</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Implementers">Feature formatters: Implementers</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Ancestor_versions">Feature formatters: Ancestor versions</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Descendant_versions">Feature formatters: Descendant versions</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Homonyms">Feature formatters: Homonyms</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_How_To%27s">EiffelStudio How To's</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio-_Starting_a_project">EiffelStudio: Starting a project</a><ul> <li><a href="/doc/eiffelstudio/EiffelStudio-_Creating_a_new_project">EiffelStudio: Creating a new project</a></li><li><a href="/doc/eiffelstudio/Retrieving_a_project_from_a_configuration_file">Retrieving a project from a configuration file</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Browsing">Browsing</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Searching">Searching</a><ul> <li><a href="/doc/eiffelstudio/Looking_for_a_cluster">Looking for a cluster</a></li><li><a href="/doc/eiffelstudio/Looking_for_a_class">Looking for a class</a></li><li><a href="/doc/eiffelstudio/Looking_for_a_feature">Looking for a feature</a></li><li><a href="/doc/eiffelstudio/Looking_for_an_expression_in_text">Looking for an expression in text</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Viewing_information_about_a_component">Viewing information about a component</a><ul> <li><a href="/doc/eiffelstudio/Centering_tools_on_a_component">Centering tools on a component</a></li><li><a href="/doc/eiffelstudio/Viewing_information_about_a_cluster">Viewing information about a cluster</a></li><li><a href="/doc/eiffelstudio/Viewing_information_about_a_class">Viewing information about a class</a></li><li><a href="/doc/eiffelstudio/Viewing_information_about_a_feature">Viewing information about a feature</a></li></ul></li><li><a href="/doc/eiffelstudio/Opening_new_windows">Opening new windows</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Editing_a_project">Editing a project</a><ul> <li><a href="/doc/eiffelstudio/Adding_a_cluster">Adding a cluster</a></li><li><a href="/doc/eiffelstudio/Adding_a_library">Adding a library</a></li><li><a href="/doc/eiffelstudio/Adding_a_class">Adding a class</a></li><li class="expandable "><a href="/doc/eiffelstudio/Adding_a_feature">Adding a feature</a><ul> <li><a href="/doc/eiffelstudio/Opening_the_new_feature_dialog">Opening the new feature dialog</a></li><li><a href="/doc/eiffelstudio/Adding_a_procedure">Adding a procedure</a></li><li><a href="/doc/eiffelstudio/Adding_a_function">Adding a function</a></li><li><a href="/doc/eiffelstudio/Adding_an_attribute">Adding an attribute</a></li></ul></li><li><a href="/doc/eiffelstudio/Removing_a_cluster">Removing a cluster</a></li><li><a href="/doc/eiffelstudio/Removing_a_class">Removing a class</a></li><li><a href="/doc/eiffelstudio/Removing_a_feature">Removing a feature</a></li><li><a href="/doc/eiffelstudio/Moving_a_class">Moving a class</a></li><li><a href="/doc/eiffelstudio/Changing_project_parameters">Changing project parameters</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Compiling">Compiling</a><ul> <li><a href="/doc/eiffelstudio/Generating_executables">Generating executables</a></li><li><a href="/doc/eiffelstudio/Generating_libraries">Generating libraries</a></li><li><a href="/doc/eiffelstudio/Setting_the_assertion_level">Setting the assertion level</a></li><li><a href="/doc/eiffelstudio/Setting_the_syntax_variant">Setting the syntax variant</a></li><li><a href="/doc/eiffelstudio/Enabling_the_profiler">Enabling the profiler</a></li><li><a href="/doc/eiffelstudio/Using_libraries">Using libraries</a></li><li><a href="/doc/eiffelstudio/Tuning_a_program">Tuning a program</a></li><li><a href="/doc/eiffelstudio/Using_threads">Using threads</a></li><li><a href="/doc/eiffelstudio/Clean_compile">Clean compile</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Running_and_debugging">Running and debugging</a><ul> <li><a href="/doc/eiffelstudio/Running_an_application">Running an application</a></li><li><a href="/doc/eiffelstudio/Interrupting_an_application">Interrupting an application</a></li><li><a href="/doc/eiffelstudio/Exploring_an_application_dynamic_state">Exploring an application dynamic state</a></li><li><a href="/doc/eiffelstudio/Using_breakpoints">Using breakpoints</a></li><li><a href="/doc/eiffelstudio/Handling_exceptions">Handling exceptions</a></li><li><a href="/doc/eiffelstudio/Using_debug_clauses">Using debug clauses</a></li><li><a href="/doc/eiffelstudio/Setting_the_command_line_arguments">Setting the command line arguments</a></li><li><a href="/doc/eiffelstudio/Profiling">Profiling</a></li><li><a href="/doc/eiffelstudio/Tracing">Tracing</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Designing_a_project">Designing a project</a><ul> <li><a href="/doc/eiffelstudio/Switching_to_the_diagram_tool">Switching to the diagram tool</a></li><li><a href="/doc/eiffelstudio/Undoing_and_redoing">Undoing and redoing</a></li><li class="expandable "><a href="/doc/eiffelstudio/Altering_the_system">Altering the system</a><ul> <li><a href="/doc/eiffelstudio/Creating_a_new_class">Creating a new class</a></li><li><a href="/doc/eiffelstudio/Creating_a_new_feature">Creating a new feature</a></li><li class="expandable "><a href="/doc/eiffelstudio/Refactoring">Refactoring</a><ul> <li><a href="/doc/eiffelstudio/Rename_Class">Rename Class</a></li><li><a href="/doc/eiffelstudio/Rename_Feature">Rename Feature</a></li><li><a href="/doc/eiffelstudio/Pull_up_Feature">Pull up Feature</a></li></ul></li><li><a href="/doc/eiffelstudio/Deleting_items">Deleting items</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Managing_links">Managing links</a><ul> <li><a href="/doc/eiffelstudio/Creating_inheritance_links">Creating inheritance links</a></li><li><a href="/doc/eiffelstudio/Creating_client-supplier_links">Creating client-supplier links</a></li><li><a href="/doc/eiffelstudio/Creating_aggregate_client-supplier_links">Creating aggregate client-supplier links</a></li><li><a href="/doc/eiffelstudio/Using_the_link_tool">Using the link tool</a></li><li><a href="/doc/eiffelstudio/Creating_handles">Creating handles</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Modifying_the_display">Modifying the display</a><ul> <li><a href="/doc/eiffelstudio/Showing_or_hiding_links_and_labels">Showing or hiding links and labels</a></li><li><a href="/doc/eiffelstudio/Changing_system_exploration_depth">Changing system exploration depth</a></li><li><a href="/doc/eiffelstudio/Removing_items_from_a_view">Removing items from a view</a></li><li><a href="/doc/eiffelstudio/Changing_colors_of_classes">Changing colors of classes</a></li><li><a href="/doc/eiffelstudio/Zooming_a_diagram">Zooming a diagram</a></li><li><a href="/doc/eiffelstudio/Retrieving_all_classes_into_a_cluster">Retrieving all classes into a cluster</a></li><li><a href="/doc/eiffelstudio/Iconifying_and_restoring_a_cluster">Iconifying and restoring a cluster</a></li><li><a href="/doc/eiffelstudio/Change_the_Display_Quality">Change the Display Quality</a></li><li><a href="/doc/eiffelstudio/Turn_on_Physics_Mode">Turn on Physics Mode</a></li><li><a href="/doc/eiffelstudio/Switching_between_BON_and_UML_View">Switching between BON and UML View</a></li><li><a href="/doc/eiffelstudio/Anchoring">Anchoring</a></li><li><a href="/doc/eiffelstudio/Adjusting_Physics_Settings">Adjusting Physics Settings</a></li><li><a href="/doc/eiffelstudio/Using_the_Cluster_Legend">Using the Cluster Legend</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Managing_views">Managing views</a><ul> <li><a href="/doc/eiffelstudio/Adding_a_view">Adding a view</a></li><li><a href="/doc/eiffelstudio/Deleting_a_view">Deleting a view</a></li></ul></li><li><a href="/doc/eiffelstudio/Exporting_a_diagram_to_PNG_image_file">Exporting a diagram to PNG image file</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/How_to_analyze_a_project">How to analyze a project</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Computing_a_measure">Computing a measure</a><ul> <li><a href="/doc/eiffelstudio/Evaluating_a_measure">Evaluating a measure</a></li><li><a href="/doc/eiffelstudio/Saving_a_measure">Saving a measure</a></li><li><a href="/doc/eiffelstudio/Viewing_measure_details">Viewing measure details</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Handling_new_metrics">Handling new metrics</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Defining_new_metrics">Defining new metrics</a><ul> <li><a href="/doc/eiffelstudio/Defining_derived_metrics">Defining derived metrics</a></li><li><a href="/doc/eiffelstudio/Defining_linear_metrics">Defining linear metrics</a></li><li><a href="/doc/eiffelstudio/Defining_ratio_metrics">Defining ratio metrics</a></li></ul></li><li><a href="/doc/eiffelstudio/Managing_new_metrics">Managing new metrics</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Handling_archives">Handling archives</a><ul> <li><a href="/doc/eiffelstudio/Creating_an_archive">Creating an archive</a></li><li><a href="/doc/eiffelstudio/Comparing_to_an_archive">Comparing to an archive</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Generating_documentation">Generating documentation</a><ul> <li><a href="/doc/eiffelstudio/Generating_multi-format_documentation">Generating multi-format documentation</a></li><li><a href="/doc/eiffelstudio/Generating_XMI_documentation">Generating XMI documentation</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Customizing_EiffelStudio">Customizing EiffelStudio</a><ul> <li><a href="/doc/eiffelstudio/Setting_the_editor_behavior">Setting the editor behavior</a></li><li><a href="/doc/eiffelstudio/Changing_texts_display">Changing texts display</a></li><li><a href="/doc/eiffelstudio/Customizing_toolbars">Customizing toolbars</a></li><li><a href="/doc/eiffelstudio/Making_the_context_tool_independent_from_the_editor">Making the context tool independent from the editor</a></li><li><a href="/doc/eiffelstudio/Changing_the_default_history_size">Changing the default history size</a></li><li><a href="/doc/eiffelstudio/Choosing_classes_to_be_ignored_in_BON_diagrams">Choosing classes to be ignored in BON diagrams</a></li><li><a href="/doc/eiffelstudio/Customizing_class_text_views">Customizing class text views</a></li><li><a href="/doc/eiffelstudio/Configuring_an_external_editor">Configuring an external editor</a></li><li><a href="/doc/eiffelstudio/Customizing_EiffelStudio_for_Subversion_commands">Customizing EiffelStudio for Subversion commands</a></li></ul></li></ul></li></ul></li><li class="expandable expanded "><a href="/doc/solutions/Solutions_and_Libraries">Solutions and Libraries</a><ul> <li><a href="/doc/solutions/IRON-_Eiffel_package_repository">IRON Eiffel repository</a></li><li class="expandable "><a href="/doc/solutions/.NET">.NET</a><ul> <li><a href="/doc/solutions/.NET_Installation_instructions">.NET Installation instructions</a></li><li><a href="/doc/solutions/Building_a_.NET_application">Building a .NET application</a></li><li class="expandable "><a href="/doc/solutions/The_Eiffel_for_.NET_language">The Eiffel for .NET language</a><ul> <li class="expandable "><a href="/doc/solutions/Conventions">Conventions</a><ul> <li><a href="/doc/solutions/Eiffel_for_.NET_Terminology">Eiffel for .NET Terminology</a></li><li><a href="/doc/solutions/Eiffel_Class_and_Feature_Names">Eiffel Class and Feature Names</a></li><li><a href="/doc/solutions/Type_Organization">Type Organization</a></li><li><a href="/doc/solutions/Constructors_and_Creation_Procedures">Constructors and Creation Procedures</a></li><li><a href="/doc/solutions/Similar_Types_Occurring_in_Both_Libraries">Similar Types Occurring in Both Libraries</a></li><li><a href="/doc/solutions/Eiffel_reserved_words">Eiffel reserved words</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_for_.NET">Eiffel for .NET</a><ul> <li><a href="/doc/solutions/Eiffel_Classes">Eiffel Classes</a></li><li><a href="/doc/solutions/Adding_Class_Features">Adding Class Features</a></li><li><a href="/doc/solutions/Inheritance">Inheritance</a></li><li><a href="/doc/solutions/Genericity">Genericity</a></li><li><a href="/doc/solutions/Design_by_Contract_and_Assertions">Design by Contract and Assertions</a></li><li><a href="/doc/solutions/Exception_Mechanism">Exception Mechanism</a></li><li><a href="/doc/solutions/Event_Programming_with_Agents">Event Programming with Agents</a></li><li><a href="/doc/solutions/Using_Referenced_Assemblies">Using Referenced Assemblies</a></li><li><a href="/doc/solutions/Eiffel_for_.NET_Compliance">Eiffel for .NET Compliance</a></li><li><a href="/doc/solutions/Referenced_Assembly_Type_and_Feature_Name_Conversion">Referenced Assembly Type and Feature Name Conversion</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_for_.NET_Integration">Eiffel for .NET Integration</a><ul> <li><a href="/doc/solutions/Workaround_Eiffel_.NET_limitations">Workarounds</a></li><li><a href="/doc/solutions/Eiffel_.NETCore_execution">NETCore execution</a></li></ul></li><li><a href="/doc/solutions/Known_issues">Known issues</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_.NET_samples">Eiffel .NET samples</a><ul> <li class="expandable "><a href="/doc/solutions/ADO_.NET_Samples">ADO .NET Samples</a><ul> <li><a href="/doc/solutions/ADO.NET_Sample">ADO.NET Sample</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Console_Samples">Console Samples</a><ul> <li><a href="/doc/solutions/Calculator-_console">Calculator: console</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Threads_Samples">Threads Samples</a><ul> <li><a href="/doc/solutions/Pools">Pools</a></li><li><a href="/doc/solutions/Timers">Timers</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Winform_Samples">Winform Samples</a><ul> <li><a href="/doc/solutions/Simple_Hello_world_form_sample">Simple Hello world form sample</a></li><li><a href="/doc/solutions/Message_Box">Message Box</a></li><li class="expandable "><a href="/doc/solutions/Menus">Menus</a><ul> <li><a href="/doc/solutions/Menu_Details">Menu Details</a></li></ul></li><li class="expandable "><a href="/doc/solutions/MDI">MDI</a><ul> <li><a href="/doc/solutions/MDI_Details">MDI Details</a></li></ul></li><li><a href="/doc/solutions/Calculator-_winform">Calculator: winform</a></li><li><a href="/doc/solutions/GDI_plus_-_text">GDI plus - text</a></li><li><a href="/doc/solutions/Date_Time_Picker">Date Time Picker</a></li><li><a href="/doc/solutions/Progress_bar_sample">Progress bar sample</a></li><li><a href="/doc/solutions/Simple_data_binding">Simple data binding</a></li><li><a href="/doc/solutions/Tree_view">Tree view</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_for_ASP.NET_Documentation">Eiffel for ASP.NET Documentation</a><ul> <li class="expandable "><a href="/doc/solutions/Writing_ASP.NET_pages_in_Eiffel">Writing ASP.NET pages in Eiffel</a><ul> <li><a href="/doc/solutions/Eiffel_for_ASP.NET_Installation">Eiffel for ASP.NET Installation</a></li><li><a href="/doc/solutions/CodeDom-_Getting_Started">CodeDom: Getting Started</a></li><li><a href="/doc/solutions/Using_Eiffel_%28to_write_ASP.NET_pages%29">Using Eiffel (to write ASP.NET pages)</a></li><li><a href="/doc/solutions/Names_Mappings">Names Mappings</a></li></ul></li><li class="expandable "><a href="/doc/solutions/The_Eiffel_CodeDom_Provider">The Eiffel CodeDom Provider</a><ul> <li><a href="/doc/solutions/About_the_Code_Document_Object_Model_%28CodeDom%29">About the Code Document Object Model (CodeDom)</a></li><li><a href="/doc/solutions/Installation">Installation</a></li><li><a href="/doc/solutions/Supported_Constructs">Supported Constructs</a></li><li><a href="/doc/solutions/Configuration">Configuration</a></li><li><a href="/doc/solutions/Logging">Logging</a></li><li><a href="/doc/solutions/Required_Permissions">Required Permissions</a></li><li><a href="/doc/solutions/Common_Scenarios">Common Scenarios</a></li><li><a href="/doc/solutions/Eiffel_Implementation">Eiffel Implementation</a></li><li><a href="/doc/solutions/Limitations">Limitations</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_for_ASP.NET_Tools_and_Administration">Eiffel for ASP.NET Tools and Administration</a><ul> <li><a href="/doc/solutions/Eiffel_CodeDom_Provider_Manager">Eiffel CodeDom Provider Manager</a></li><li><a href="/doc/solutions/eSplitter">eSplitter</a></li><li><a href="/doc/solutions/Name_Mapper">Name Mapper</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Basic_computing">Basic computing</a><ul> <li><a href="/doc/solutions/Process_and_BaseProcess">External processes</a></li><li class="expandable "><a href="/doc/solutions/EiffelBase">EiffelBase</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBase_Tutorial">EiffelBase Tutorial</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBase%2C_The_Kernel">EiffelBase, The Kernel</a><ul> <li><a href="/doc/solutions/Universal_class_and_its_features">Universal class and its features</a></li><li><a href="/doc/solutions/Language-related_facilities">Language-related facilities</a></li><li><a href="/doc/solutions/Files%2C_input%2C_output">Files, input, output</a></li><li><a href="/doc/solutions/Persistence%2C_storage%2C_and_retrieval">Persistence, storage, and retrieval</a></li><li><a href="/doc/solutions/Access_to_internal_properties">Access to internal properties</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelBase_Data_Structures_Overview">EiffelBase Data Structures Overview</a><ul> <li><a href="/doc/solutions/EiffelBase%2C_Abstract_Container_Structures-_The_Taxonomy">EiffelBase, Abstract Container Structures: The Taxonomy</a></li><li><a href="/doc/solutions/EiffelBase_Data_Structures%2C_Lists">EiffelBase Data Structures, Lists</a></li><li><a href="/doc/solutions/EiffelBase%2C_Dispensers">EiffelBase, Dispensers</a></li><li><a href="/doc/solutions/EiffelBase%2C_Trees">EiffelBase, Trees</a></li><li><a href="/doc/solutions/EiffelBase%2C_Sets">EiffelBase, Sets</a></li><li><a href="/doc/solutions/EiffelBase%2C_Tables">EiffelBase, Tables</a></li><li><a href="/doc/solutions/EiffelBase%2C_Iteration">EiffelBase, Iteration</a></li></ul></li><li><a href="/doc/solutions/EiffelBase_Support_Cluster">EiffelBase Support Cluster</a></li></ul></li><li><a href="/doc/solutions/EiffelBase_Class_Reference">EiffelBase Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelBase_Samples">EiffelBase Samples</a><ul> <li><a href="/doc/solutions/EiffelBase_Sample-_Calculator">EiffelBase Sample: Calculator</a></li></ul></li><li><a href="/doc/solutions/Eiffel_Software_Free_Eiffel_Library_License_%28IFELL%29">Free Eiffel Library License</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Graphics">Graphics</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBuild">EiffelBuild</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBuild_How_To%27s">EiffelBuild How To's</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBuild-_Starting_a_project">EiffelBuild: Starting a project</a><ul> <li><a href="/doc/solutions/EiffelBuild-_Creating_a_new_project">EiffelBuild: Creating a new project</a></li><li><a href="/doc/solutions/Retrieving_a_project_from_a_Build_project_file">Retrieving a project from a Build project file</a></li></ul></li><li><a href="/doc/solutions/Create_an_object">Create an object</a></li><li><a href="/doc/solutions/Delete_an_object">Delete an object</a></li><li><a href="/doc/solutions/Save_a_project">Save a project</a></li><li><a href="/doc/solutions/Reparent_an_Object">Reparent an Object</a></li><li><a href="/doc/solutions/Import_a_project">Import a project</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelBuild_Reference">EiffelBuild Reference</a><ul> <li><a href="/doc/solutions/EiffelBuild_Notation">EiffelBuild Notation</a></li><li class="expandable "><a href="/doc/solutions/EiffelBuild-_General_interface_description">EiffelBuild: General interface description</a><ul> <li><a href="/doc/solutions/EiffelBuild_window_overview">EiffelBuild window overview</a></li><li><a href="/doc/solutions/Main_toolbar">Main toolbar</a></li><li><a href="/doc/solutions/EiffelBuild-_Key_shortcuts">EiffelBuild: Key shortcuts</a></li><li><a href="/doc/solutions/Docking">Docking</a></li></ul></li><li><a href="/doc/solutions/Layout_constructor">Layout constructor</a></li><li><a href="/doc/solutions/Type_selector">Type selector</a></li><li class="expandable "><a href="/doc/solutions/Object_editor">Object editor</a><ul> <li><a href="/doc/solutions/Merging_radio_button_groups">Merging radio button groups</a></li><li><a href="/doc/solutions/Positioning_table_children">Positioning table children</a></li><li><a href="/doc/solutions/Positioning_fixed_children">Positioning fixed children</a></li></ul></li><li><a href="/doc/solutions/Display_window">Display window</a></li><li><a href="/doc/solutions/Builder_window">Builder window</a></li><li><a href="/doc/solutions/Component_selector">Component selector</a></li><li><a href="/doc/solutions/Widget_selector">Widget selector</a></li><li><a href="/doc/solutions/Component_viewer">Component viewer</a></li><li><a href="/doc/solutions/History">History</a></li><li><a href="/doc/solutions/Constants">Constants</a></li><li class="expandable "><a href="/doc/solutions/EiffelBuild-_Project_settings_window">EiffelBuild: Project settings window</a><ul> <li><a href="/doc/solutions/Build_Tab">Build Tab</a></li><li><a href="/doc/solutions/Generation_Tab">Generation Tab</a></li></ul></li><li><a href="/doc/solutions/EiffelBuild_Preferences">EiffelBuild Preferences</a></li><li><a href="/doc/solutions/EiffelBuild-_Code_Generation">EiffelBuild: Code Generation</a></li></ul></li><li><a href="/doc/solutions/EiffelBuild_Version_History">EiffelBuild Version History</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelVision_2">EiffelVision 2</a><ul> <li><a href="/doc/solutions/EiffelVision_Introduction">EiffelVision Introduction</a></li><li class="expandable "><a href="/doc/solutions/Vison2_-_How-to">How to ...</a><ul> <li><a href="/doc/solutions/How_to_build_a_concurrent_graphical_application-_EiffelVision_with_SCOOP">How to build a concurrent graphical application: EiffelVision with SCOOP</a></li><li><a href="/doc/solutions/Triggering_Pick-and-Drop">Triggering PnD</a></li><li><a href="/doc/solutions/Converting_EiffelVision_2_Systems_to_Void-Safety">Converting EiffelVision 2 Systems to Void-Safety</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelVision_Library_Reference_Manual">EiffelVision Library Reference Manual</a><ul> <li><a href="/doc/solutions/Kernel">Kernel</a></li><li class="expandable "><a href="/doc/solutions/Widgets">Widgets</a><ul> <li><a href="/doc/solutions/Primitives">Primitives</a></li><li><a href="/doc/solutions/Containers">Containers</a></li><li><a href="/doc/solutions/EiffelVision_Dialogs">EiffelVision Dialogs</a></li></ul></li><li><a href="/doc/solutions/Items">Items</a></li><li><a href="/doc/solutions/Events">Events</a></li><li class="expandable "><a href="/doc/solutions/Properties">Properties</a><ul> <li><a href="/doc/solutions/EiffelVision_Pick_and_Drop">EiffelVision Pick and Drop</a></li></ul></li><li><a href="/doc/solutions/Support">Support</a></li><li><a href="/doc/solutions/Figures">Figures</a></li></ul></li><li><a href="/doc/solutions/EiffelVision_2_Class_Reference">EiffelVision 2 Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelVision_2_Samples">EiffelVision 2 Samples</a><ul> <li><a href="/doc/solutions/Widgets_Sample">Widgets Sample</a></li><li><a href="/doc/solutions/Accelerator_Sample">Accelerator Sample</a></li><li><a href="/doc/solutions/Cursor_Sample">Cursor Sample</a></li><li><a href="/doc/solutions/Gauges_Sample">Gauges Sample</a></li><li><a href="/doc/solutions/Standard_dialogs_Sample">Standard_dialogs Sample</a></li><li><a href="/doc/solutions/Viewport_Sample">Viewport Sample</a></li></ul></li><li><a href="/doc/solutions/Revisions_and_Bug_Fixes">Revisions and Bug Fixes</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Dates_and_times">Dates and times</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelTime">EiffelTime</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelTime_Tutorial">EiffelTime Tutorial</a><ul> <li><a href="/doc/solutions/Absolute_time">Absolute time</a></li><li><a href="/doc/solutions/Duration">Duration</a></li><li><a href="/doc/solutions/Interval">Interval</a></li><li><a href="/doc/solutions/DATE_TIME_to_STRING_Conversion">DATE TIME to STRING Conversion</a></li><li><a href="/doc/solutions/More_precision">More precision</a></li></ul></li><li><a href="/doc/solutions/EiffelTime_Class_Reference">EiffelTime Class Reference</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Including_other_languages">With other languages</a><ul> <li class="expandable "><a href="/doc/solutions/Eiffel_%22external%22_mechanism">Eiffel "external" mechanism</a><ul> <li><a href="/doc/solutions/Interfacing_with_C_and_C%2B%2B">Interfacing with C and C++</a></li><li><a href="/doc/solutions/Interfacing_with_DLLs">Interfacing with DLLs</a></li><li class="expandable "><a href="/doc/solutions/Obsolete_%22external%22_interfaces">Obsolete "external" interfaces</a><ul> <li><a href="/doc/solutions/C_externals">C externals</a></li><li><a href="/doc/solutions/C%2B%2B_Externals">C++ Externals</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/CECIL">CECIL</a><ul> <li><a href="/doc/solutions/Compiling_an_Eiffel_system_for_CECIL">Compiling an Eiffel system for CECIL</a></li><li><a href="/doc/solutions/Using_a_CECIL_archive">Using a CECIL archive</a></li><li><a href="/doc/solutions/CECIL_interface_overview">CECIL interface overview</a></li><li class="expandable "><a href="/doc/solutions/CECIL_Reference">CECIL Reference</a><ul> <li><a href="/doc/solutions/attribute_exists">attribute_exists</a></li><li><a href="/doc/solutions/eif_access">eif_access</a></li><li><a href="/doc/solutions/eif_adopt">eif_adopt</a></li><li><a href="/doc/solutions/eif_attribute">eif_attribute</a></li><li><a href="/doc/solutions/eif_attribute_type">eif_attribute_type</a></li><li><a href="/doc/solutions/eif_create">eif_create</a></li><li><a href="/doc/solutions/eif_disable_visible_exception">eif_disable_visible_exception</a></li><li><a href="/doc/solutions/eif_enable_visible_exception">eif_enable_visible_exception</a></li><li><a href="/doc/solutions/eif_name">eif_name</a></li><li><a href="/doc/solutions/eif_name_by_tid">eif_name_by_tid</a></li><li><a href="/doc/solutions/eif_procedure">eif_procedure</a></li><li><a href="/doc/solutions/eif_protect">eif_protect</a></li><li><a href="/doc/solutions/eif_string">eif_string</a></li><li><a href="/doc/solutions/eif_type">eif_type</a></li><li><a href="/doc/solutions/eif_type_by_name">eif_type_by_name</a></li><li><a href="/doc/solutions/eif_type_by_reference">eif_type_by_reference</a></li><li><a href="/doc/solutions/eif_type_id">eif_type_id</a></li><li><a href="/doc/solutions/eif_wean">eif_wean</a></li><li><a href="/doc/solutions/eif_%2A_function">eif_*_function</a></li></ul></li><li class="expandable "><a href="/doc/solutions/CECIL_samples">CECIL samples</a><ul> <li><a href="/doc/solutions/CECIL_-_C_to_Eiffel">CECIL - C to Eiffel</a></li><li><a href="/doc/solutions/CECIL_-_Eiffel_to_C">CECIL - Eiffel to C</a></li><li><a href="/doc/solutions/CECIL_-_Basic_sample">CECIL - Basic sample</a></li><li><a href="/doc/solutions/CECIL_-_Threads">CECIL - Threads</a></li><li><a href="/doc/solutions/CECIL_-_How_to_compile_the_samples%3F">CECIL - How to compile the samples?</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel2Java">Eiffel2Java</a><ul> <li><a href="/doc/solutions/Eiffel2Java_Tutorial">Eiffel2Java Tutorial</a></li><li><a href="/doc/solutions/Eiffel2Java_class_reference">Eiffel2Java class reference</a></li><li><a href="/doc/solutions/Eiffel2Java_Sample">Eiffel2Java Sample</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Porting_instructions">Porting instructions</a><ul> <li><a href="/doc/solutions/Porting_an_Eiffel_application_from_UNIX_to_Windows_or_vice-versa">Porting an Eiffel application from UNIX to Windows or vice-versa</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Concurrency">Concurrency</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelThreads">EiffelThreads</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelThread_Tutorial">EiffelThread Tutorial</a><ul> <li><a href="/doc/solutions/Thread_library_overview">Thread library overview</a></li><li><a href="/doc/solutions/Compilation_of_multithreaded_systems">Compilation of multithreaded systems</a></li><li><a href="/doc/solutions/Once_features_in_multithreaded_mode">Once features in multithreaded mode</a></li><li><a href="/doc/solutions/Multithread_FAQ">Multithread FAQ</a></li></ul></li><li><a href="/doc/solutions/EiffelThread_Class_Reference">EiffelThread Class Reference</a></li></ul></li><li><a href="/doc/solutions/SCOOP_tutorial">SCOOP Tutorial (hands-on): a small concurrent email system</a></li><li class="expandable "><a href="/doc/solutions/Concurrent_programming_with_SCOOP">SCOOP</a><ul> <li><a href="/doc/solutions/Getting_Started_with_SCOOP">Getting Started</a></li><li><a href="/doc/solutions/Regions_and_Processors">Regions and Processors</a></li><li><a href="/doc/solutions/Separate_Calls">Separate Calls</a></li><li><a href="/doc/solutions/Exclusive_Access">Exclusive Access</a></li><li><a href="/doc/solutions/Design_by_Contract_in_SCOOP">Design by Contract</a></li><li><a href="/doc/solutions/Asynchronous_Calls">Asynchronous Calls</a></li><li><a href="/doc/solutions/Exceptions_in_SCOOP">Exceptions</a></li><li class="expandable "><a href="/doc/solutions/SCOOP_examples">SCOOP examples</a><ul> <li><a href="/doc/solutions/Single-element_producer-consumer">Single-element producer-consumer</a></li><li><a href="/doc/solutions/Counter">Counter</a></li><li><a href="/doc/solutions/Producer-consumer">Producer-consumer</a></li><li><a href="/doc/solutions/Dining_philosophers">Dining philosophers</a></li><li><a href="/doc/solutions/Barbershop">Barbershop</a></li><li><a href="/doc/solutions/Baboon_crossing">Baboon crossing</a></li><li><a href="/doc/solutions/Search-insert-delete">Search-insert-delete</a></li><li><a href="/doc/solutions/Senate_bus">Senate bus</a></li><li><a href="/doc/solutions/Quicksort">Quicksort</a></li><li><a href="/doc/solutions/Dining_savages">Dining savages</a></li><li><a href="/doc/solutions/Faneuil_Hall">Faneuil Hall</a></li><li><a href="/doc/solutions/Observer_pattern">Observer pattern</a></li></ul></li><li><a href="/doc/solutions/SCOOP_implementation">SCOOP implementation</a></li><li><a href="/doc/solutions/SCOOP_papers">papers</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Networking">Networking</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelNet">EiffelNet</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelNet_Tutorial">EiffelNet Tutorial</a><ul> <li><a href="/doc/solutions/What_is_EiffelNet">What is EiffelNet</a></li><li><a href="/doc/solutions/Clients_and_servers">Clients and servers</a></li><li><a href="/doc/solutions/An_overview_of_EiffelNet_Mechanisms">An overview of EiffelNet Mechanisms</a></li><li><a href="/doc/solutions/Introduction_to_the_examples">Introduction to the examples</a></li><li><a href="/doc/solutions/Obtaining_a_finer_degree_of_control">Obtaining a finer degree of control</a></li><li><a href="/doc/solutions/Using_datagram_sockets">Using datagram sockets</a></li><li><a href="/doc/solutions/Event-driven_command_execution">Event-driven command execution</a></li><li><a href="/doc/solutions/A_more_complex_example">A more complex example</a></li><li><a href="/doc/solutions/Bibliography">Bibliography</a></li></ul></li><li><a href="/doc/solutions/EiffelNet_Class_Reference">EiffelNet Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelNet_Samples">EiffelNet Samples</a><ul> <li><a href="/doc/solutions/Advanced">Advanced</a></li><li><a href="/doc/solutions/Polling">Polling</a></li><li><a href="/doc/solutions/Predef">Predef</a></li><li><a href="/doc/solutions/Same_Machine">Same Machine</a></li><li><a href="/doc/solutions/Two_Machines">Two Machines</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Database_access">Database access</a><ul> <li class="expandable "><a href="/doc/solutions/ABEL">ABEL</a><ul> <li class="expandable "><a href="/doc/solutions/Tutorial">Tutorial</a><ul> <li><a href="/doc/solutions/Getting_started">Getting started</a></li><li><a href="/doc/solutions/Basic_operations">Basic operations</a></li><li><a href="/doc/solutions/Advanced_Queries">Advanced Queries</a></li><li><a href="/doc/solutions/Dealing_with_references">Dealing with references</a></li><li><a href="/doc/solutions/Tuple_queries">Tuple queries</a></li><li><a href="/doc/solutions/Error_handling">Error handling</a></li><li><a href="/doc/solutions/Accessing_an_existing_database">Accessing an existing database</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelStore">EiffelStore</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelStore_Tutorial">EiffelStore Tutorial</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelStore_Interface_Layer">EiffelStore Interface Layer</a><ul> <li><a href="/doc/solutions/Database_Connection">Database Connection</a></li><li><a href="/doc/solutions/Data_Modification">Data Modification</a></li><li><a href="/doc/solutions/Database_Selection">Database Selection</a></li><li><a href="/doc/solutions/Selection_Access">Selection Access</a></li><li><a href="/doc/solutions/Data_Object_Coupling">Data Object Coupling</a></li><li><a href="/doc/solutions/Query_variables">Query variables</a></li><li><a href="/doc/solutions/Stored_Procedures">Stored Procedures</a></li><li><a href="/doc/solutions/Database_control">Database control</a></li></ul></li><li><a href="/doc/solutions/EiffelStore_Implementation_Layer">EiffelStore Implementation Layer</a></li><li class="expandable "><a href="/doc/solutions/EiffelStore_Generation_Cluster">EiffelStore Generation Cluster</a><ul> <li><a href="/doc/solutions/Data_structures_use">Data structures use</a></li><li><a href="/doc/solutions/Data_structures_creation">Data structures creation</a></li></ul></li><li><a href="/doc/solutions/EiffelStore_DataView_Cluster">EiffelStore DataView Cluster</a></li></ul></li><li><a href="/doc/solutions/EiffelStore_Class_Reference">EiffelStore Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelStore_Samples">EiffelStore Samples</a><ul> <li><a href="/doc/solutions/Esql_Sample">Esql Sample</a></li><li><a href="/doc/solutions/Selector_Sample">Selector Sample</a></li><li><a href="/doc/solutions/Inserter_Sample">Inserter Sample</a></li></ul></li><li><a href="/doc/solutions/Defending_against_SQL_injections_with_EiffelStore">SQL injection</a></li><li><a href="/doc/solutions/EiffelStore_ODBC_with_PostgreSQL">EiffelStore ODBC</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Web_technology">Web technology</a><ul> <li><a href="/doc/solutions/EiffelWeb_framework">EiffelWeb</a></li><li class="expandable "><a href="/doc/solutions/Obsolete_EiffelWeb">Obsolete EiffelWeb</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelWeb_Tutorial">EiffelWeb Tutorial</a><ul> <li><a href="/doc/solutions/EiffelWeb_Content_Introduction">EiffelWeb Content Introduction</a></li><li><a href="/doc/solutions/Processing_Requests">Processing Requests</a></li></ul></li><li><a href="/doc/solutions/EiffelWeb_Class_Reference">EiffelWeb Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelWeb_Sample">EiffelWeb Sample</a><ul> <li><a href="/doc/solutions/EiffelWeb_Basic_Sample">EiffelWeb Basic Sample</a></li></ul></li></ul></li></ul></li><li class="expandable expanded "><a href="/doc/solutions/Text_processing">Text processing</a><ul> <li class="expandable expanded "><a href="/doc/solutions/EiffelLex">EiffelLex</a><ul> <li class="active "><a href="/doc/solutions/EiffelLex_Tutorial">EiffelLex Tutorial</a></li><li><a href="/doc/solutions/EiffelLex_Class_Reference">EiffelLex Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelLex_Sample">EiffelLex Sample</a><ul> <li class="expandable "><a href="/doc/solutions/Eiffel_scanner">Eiffel scanner</a><ul> <li><a href="/doc/solutions/EiffelLex_Samples">EiffelLex Samples</a></li><li><a href="/doc/solutions/EIFFEL_SCAN_Text">EIFFEL_SCAN Text</a></li><li><a href="/doc/solutions/eiffel_scan_console_input">eiffel_scan console input</a></li><li><a href="/doc/solutions/eiffel_scan_console_output">eiffel_scan console output</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelParse">EiffelParse</a><ul> <li><a href="/doc/solutions/EiffelParse_Tutorial">EiffelParse Tutorial</a></li><li><a href="/doc/solutions/EiffelParse_Class_Reference">EiffelParse Class Reference</a></li><li class="expandable "><a href="/doc/solutions/Parse_Sample">Parse Sample</a><ul> <li><a href="/doc/solutions/Eiffel_polynomial_parser">Eiffel polynomial parser</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Preferences">Preferences</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelPreferences">EiffelPreferences</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelPreferences_Tutorial">EiffelPreferences Tutorial</a><ul> <li><a href="/doc/solutions/Overview">Overview</a></li><li><a href="/doc/solutions/Initialization">Initialization</a></li><li><a href="/doc/solutions/Interface_for_preferences">Interface for preferences</a></li></ul></li><li><a href="/doc/solutions/EiffelPreferences_Class_Reference">EiffelPreferences Class Reference</a></li><li><a href="/doc/solutions/EiffelPreferences_Sample">EiffelPreferences Sample</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Platform_specifics">Platform specifics</a><ul> <li class="expandable "><a href="/doc/solutions/Microsoft_Windows">Microsoft Windows</a><ul> <li class="expandable "><a href="/doc/solutions/WEL">WEL</a><ul> <li class="expandable "><a href="/doc/solutions/WEL_Common_Concepts">WEL Common Concepts</a><ul> <li><a href="/doc/solutions/Inheriting_WEL_APPLICATION">Inheriting WEL_APPLICATION</a></li><li><a href="/doc/solutions/Redefining_main_window">Redefining main_window</a></li><li><a href="/doc/solutions/Redefining_%60init_application%27">Redefining `init_application'</a></li><li><a href="/doc/solutions/Common_message_hooks">Common message hooks</a></li></ul></li><li class="expandable "><a href="/doc/solutions/WEL_Interface_Content">WEL Interface Content</a><ul> <li><a href="/doc/solutions/windows_cluster">windows cluster</a></li><li class="expandable "><a href="/doc/solutions/controls_cluster">controls cluster</a><ul> <li><a href="/doc/solutions/WEL_CHECKBOX">WEL_CHECKBOX</a></li><li><a href="/doc/solutions/WEL_CHECK_BOX_3_STATE">WEL_CHECK_BOX_3_STATE</a></li><li><a href="/doc/solutions/WEL_GROUP_BOX">WEL_GROUP_BOX</a></li><li><a href="/doc/solutions/WEL_LIST_VIEW">WEL_LIST_VIEW</a></li><li><a href="/doc/solutions/WEL_MULTIPLE_LINE_EDIT">WEL_MULTIPLE_LINE_EDIT</a></li><li><a href="/doc/solutions/WEL_MULTIPLE_SELECTION_LIST_BOX">WEL_MULTIPLE_SELECTION_LIST_BOX</a></li><li><a href="/doc/solutions/WEL_OWNER_DRAW_BUTTON">WEL_OWNER_DRAW_BUTTON</a></li><li><a href="/doc/solutions/WEL_PROGRESS_BAR">WEL_PROGRESS_BAR</a></li><li><a href="/doc/solutions/WEL_PUSH_BUTTON">WEL_PUSH_BUTTON</a></li><li><a href="/doc/solutions/WEL_RADIO_BUTTON">WEL_RADIO_BUTTON</a></li><li><a href="/doc/solutions/WEL_SCROLL_BAR">WEL_SCROLL_BAR</a></li><li><a href="/doc/solutions/WEL_SINGLE_LINE_EDIT">WEL_SINGLE_LINE_EDIT</a></li><li><a href="/doc/solutions/WEL_SINGLE_SELECTION_LIST_BOX">WEL_SINGLE_SELECTION_LIST_BOX</a></li><li><a href="/doc/solutions/WEL_TOOLTIP">WEL_TOOLTIP</a></li><li><a href="/doc/solutions/WEL_TRACK_BAR">WEL_TRACK_BAR</a></li><li><a href="/doc/solutions/WEL_UP_DOWN_CONTROL">WEL_UP_DOWN_CONTROL</a></li></ul></li><li class="expandable "><a href="/doc/solutions/stddlgs_cluster">stddlgs cluster</a><ul> <li><a href="/doc/solutions/WEL_CHOOSE_COLOR_DIALOG">WEL_CHOOSE_COLOR_DIALOG</a></li><li><a href="/doc/solutions/WEL_CHOOSE_FOLDER_DIALOG">WEL_CHOOSE_FOLDER_DIALOG</a></li><li><a href="/doc/solutions/WEL_CHOOSE_FONT_DIALOG">WEL_CHOOSE_FONT_DIALOG</a></li><li><a href="/doc/solutions/WEL_OPEN_FILE_DIALOG">WEL_OPEN_FILE_DIALOG</a></li><li><a href="/doc/solutions/WEL_PRINT_DIALOG">WEL_PRINT_DIALOG</a></li><li><a href="/doc/solutions/WEL_SAVE_FILE_DIALOG">WEL_SAVE_FILE_DIALOG</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/WEL_Tutorial">WEL Tutorial</a><ul> <li><a href="/doc/solutions/Tutorial_Step_1">Tutorial Step 1</a></li><li><a href="/doc/solutions/Tutorial_Step_2">Tutorial Step 2</a></li><li><a href="/doc/solutions/Tutorial_Step_3">Tutorial Step 3</a></li><li><a href="/doc/solutions/Tutorial_Step_4">Tutorial Step 4</a></li><li><a href="/doc/solutions/Tutorial_Step_5">Tutorial Step 5</a></li><li><a href="/doc/solutions/Tutorial_Step_6">Tutorial Step 6</a></li><li><a href="/doc/solutions/Tutorial_Step_7">Tutorial Step 7</a></li><li><a href="/doc/solutions/Tutorial_Step_8">Tutorial Step 8</a></li></ul></li><li><a href="/doc/solutions/WEL_Class_Reference">WEL Class Reference</a></li><li class="expandable "><a href="/doc/solutions/WEL_Samples">WEL Samples</a><ul> <li><a href="/doc/solutions/Bmpview">Bmpview</a></li><li><a href="/doc/solutions/Brushes">Brushes</a></li><li><a href="/doc/solutions/Common_Controls">Common Controls</a></li><li><a href="/doc/solutions/Commands">Commands</a></li><li><a href="/doc/solutions/Controls_Sample">Controls Sample</a></li><li><a href="/doc/solutions/Ctlcolor">Ctlcolor</a></li><li><a href="/doc/solutions/Cursors">Cursors</a></li><li><a href="/doc/solutions/Disk_Space">Disk Space</a></li><li><a href="/doc/solutions/Fontenum">Fontenum</a></li><li><a href="/doc/solutions/Fun">Fun</a></li><li><a href="/doc/solutions/Header_Control">Header Control</a></li><li><a href="/doc/solutions/Hello_World%21">Hello World!</a></li><li><a href="/doc/solutions/List_View">List View</a></li><li><a href="/doc/solutions/Magnify">Magnify</a></li><li><a href="/doc/solutions/MDI_%28Multiple_Document_Interface%29">MDI (Multiple Document Interface)</a></li><li><a href="/doc/solutions/Wel_Sample-_Menus">Wel Sample: Menus</a></li><li><a href="/doc/solutions/Minimal">Minimal</a></li><li><a href="/doc/solutions/Pizza">Pizza</a></li><li><a href="/doc/solutions/Printer">Printer</a></li><li><a href="/doc/solutions/Rich_Edit">Rich Edit</a></li><li><a href="/doc/solutions/Split_Area">Split Area</a></li><li><a href="/doc/solutions/Standard_Dialogs_Sample">Standard Dialogs Sample</a></li><li><a href="/doc/solutions/Timer">Timer</a></li><li><a href="/doc/solutions/Tree_View_Sample">Tree View Sample</a></li><li><a href="/doc/solutions/Unicode_Sample">Unicode Sample</a></li><li><a href="/doc/solutions/Windows_Sample">Windows Sample</a></li><li><a href="/doc/solutions/Xcell">Xcell</a></li><li><a href="/doc/solutions/XY_Co-ordinates">XY Co-ordinates</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/COM">COM</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelCOM_Wizard">EiffelCOM Wizard</a><ul> <li class="expandable "><a href="/doc/solutions/COM_and_Eiffel">COM and Eiffel</a><ul> <li><a href="/doc/solutions/EiffelCOM-_Introduction">EiffelCOM: Introduction</a></li><li><a href="/doc/solutions/COM_Concepts">COM Concepts</a></li><li><a href="/doc/solutions/COM_Interfaces">COM Interfaces</a></li><li><a href="/doc/solutions/Coclass">Coclass</a></li><li><a href="/doc/solutions/The_Component_Location">The Component Location</a></li><li><a href="/doc/solutions/Access_Type">Access Type</a></li><li><a href="/doc/solutions/Deeper_into_COM">Deeper into COM</a></li></ul></li><li><a href="/doc/solutions/EiffelCOM_Wizard_Introduction">EiffelCOM Wizard Introduction</a></li><li class="expandable "><a href="/doc/solutions/EiffelCOM_Wizard_Guided_Tour">EiffelCOM Wizard Guided Tour</a><ul> <li><a href="/doc/solutions/Creating_a_New_COM_Component">Creating a New COM Component</a></li><li><a href="/doc/solutions/Creating_a_new_component_from_an_Eiffel_project">Creating a new component from an Eiffel project</a></li><li><a href="/doc/solutions/Accessing_a_COM_Component">Accessing a COM Component</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelCOM_Wizard_Reference">EiffelCOM Wizard Reference</a><ul> <li><a href="/doc/solutions/How_the_EiffelCOM_Wizard_works">How the EiffelCOM Wizard works</a></li><li><a href="/doc/solutions/Generated_Files">Generated Files</a></li><li><a href="/doc/solutions/Class_Hierarchy">Class Hierarchy</a></li><li><a href="/doc/solutions/Eiffel_Project_Processing">Eiffel Project Processing</a></li><li><a href="/doc/solutions/Reusing_a_COM_Component">Reusing a COM Component</a></li><li><a href="/doc/solutions/Building_a_COM_Component">Building a COM Component</a></li><li><a href="/doc/solutions/Wizards-_Command_Line_Options">Wizards: Command Line Options</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelCOM_Library">EiffelCOM Library</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelCOM_Interface_Content">EiffelCOM Interface Content</a><ul> <li><a href="/doc/solutions/Interfaces">Interfaces</a></li><li><a href="/doc/solutions/Structures">Structures</a></li></ul></li><li><a href="/doc/solutions/EiffelCOM_Class_Reference">EiffelCOM Class Reference</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/ResourceBench">ResourceBench</a><ul> <li><a href="/doc/solutions/Features">Features</a></li><li><a href="/doc/solutions/Tour">Tour</a></li><li><a href="/doc/solutions/Troubleshooting">Troubleshooting</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelRibbon">EiffelRibbon</a><ul> <li><a href="/doc/solutions/EiffelRibbon_Design_Tool">EiffelRibbon Design Tool</a></li></ul></li></ul></li></ul></li></ul></li><li><a href="/doc/glossary/Glossary">Glossary</a></li><li><a href="/doc/faq/FAQ">FAQ</a></li><li class="expandable "><a href="/doc/contribute/How_to_contribute">Contribute</a><ul> <li><a href="/doc/contribute/How_to_contribute_to_documentation">To documentation</a></li><li><a href="/doc/contribute/Help_to_edit_documentation">Editing help</a></li></ul></li></ul> </div></div></div></div> </aside> <div class="content"> <header class="head"> <div id="breadcrumb"> <span class="ico"><img src="/theme/responsive-eiffel-org/images/ico-document.png" width="21" height="21" alt="Documentation"></span> <a href="https://www.eiffel.org/doc/solutions">solutions</a> :: EiffelLex Tutorial </div> </header> <div><div class="wdocs-versions">Version<ul><li class="active"><a href="/doc/solutions/EiffelLex_Tutorial">25.02 (released) ...</a><ul class="popup-menu"><li><a href="/doc/version/trunk/solutions/EiffelLex_Tutorial">trunk (trunk)</a></li><li class="active"><a href="/doc/solutions/EiffelLex_Tutorial">25.02 (released)</a></li><li><a href="/doc/version/24.05/solutions/EiffelLex_Tutorial">24.05</a></li><li><a href="/doc/version/23.09/solutions/EiffelLex_Tutorial">23.09</a></li><li><a href="/doc/version/22.12/solutions/EiffelLex_Tutorial">22.12</a></li></ul></li></ul></div> <ul class="taxonomy term-1">Tags: <li><a href="/taxonomy/term/186">token</a></li><li><a href="/taxonomy/term/187">parser</a></li><li><a href="/taxonomy/term/278">lex</a></li></ul> <div class="wikipage"><h1 class="wikititle">EiffelLex Tutorial</h1> <div class="wiki-toc wiki-toc-auto"> <ol><a id="toc"></a><span class="title">Contents</span> <li><a href="#OVERVIEW">OVERVIEW</a></li> <li><a href="#AIMS_AND_SCOPE_OF_THE_EIFFELLEX_LIBRARY">AIMS AND SCOPE OF THE EIFFELLEX LIBRARY</a><ol> <li><a href="#Basic_terminology">Basic terminology</a></li> <li><a href="#Overview_of_the_classes">Overview of the classes</a></li> <li><a href="#Library_example">Library example</a></li> <li><a href="#Dealing_with_finite_automata">Dealing with finite automata</a></li> </ol> </li> <li><a href="#TOKENS">TOKENS</a></li> <li><a href="#BUILDING_AND_USING_LEXICAL_ANALYZERS">BUILDING AND USING LEXICAL ANALYZERS</a></li> <li><a href="#LEXICAL_GRAMMAR_FILES_AND_CLASS_SCANNING">LEXICAL GRAMMAR FILES AND CLASS SCANNING</a><ol> <li><a href="#The_build_procedure">The build procedure</a></li> <li><a href="#Lexical_grammar_files">Lexical grammar files</a></li> <li><a href="#Using_a_lexical_analyzer">Using a lexical analyzer</a></li> </ol> </li> <li><a href="#ANALYZING_INPUT">ANALYZING INPUT</a><ol> <li><a href="#Class_LEXICAL">Class LEXICAL</a></li> <li><a href="#Creating,_retrieving_and_storing_an_analyzer">Creating, retrieving and storing an analyzer</a></li> <li><a href="#Choosing_a_document">Choosing a document</a></li> <li><a href="#Obtaining_the_tokens">Obtaining the tokens</a></li> <li><a href="#The_basic_scheme">The basic scheme</a></li> </ol> </li> <li><a href="#REGULAR_EXPRESSIONS">REGULAR EXPRESSIONS</a><ol> <li><a href="#Basic_expressions">Basic expressions</a></li> <li><a href="#Intervals">Intervals</a></li> <li><a href="#Basic_operator_expressions">Basic operator expressions</a></li> <li><a href="#Iterations">Iterations</a></li> <li><a href="#Other_operator_expressions">Other operator expressions</a></li> <li><a href="#Predefined_expressions">Predefined expressions</a></li> <li><a href="#Combining_expression-building_mechanisms">Combining expression-building mechanisms</a></li> <li><a href="#Dealing_with_keywords">Dealing with keywords</a></li> <li><a href="#Case_sensitivity">Case sensitivity</a></li> </ol> </li> <li><a href="#USING_METALEX_TO_BUILD_A_LEXICAL_ANALYZER">USING METALEX TO BUILD A LEXICAL ANALYZER</a><ol> <li><a href="#Steps_in_using_METALEX">Steps in using METALEX</a></li> <li><a href="#Recording_token_types_and_regular_expressions">Recording token types and regular expressions</a></li> </ol> </li> <li><a href="#BUILDING_A_LEXICAL_ANALYZER_WITH_LEX_BUILDER">BUILDING A LEXICAL ANALYZER WITH LEX_BUILDER</a><ol> <li><a href="#Building_a_lexical_analyzer">Building a lexical analyzer</a></li> <li><a href="#An_example">An example</a></li> <li><a href="#Selecting_visible_tools">Selecting visible tools</a></li> </ol> </li> </ol> </div> <p></p> <a id="OVERVIEW"></a><h2>OVERVIEW</h2> <p>When analyzing a text by computer, it is usually necessary to split it into individual components or <strong>tokens</strong>. In human languages, the tokens are the words; in programming languages, tokens are the basic constituents of software texts, such as identifiers, constants and special symbols. </p> <p>The process of recognizing the successive tokens of a text is called lexical analysis. This chapter describes the EiffelLex library, a set of classes which make it possible to build and apply lexical analyzers to many different languages. </p> <p>Besides recognizing the tokens, it is usually necessary to recognize the deeper syntactic structure of the text. This process is called <strong>parsing</strong> or <strong>syntax analysis</strong> and is studied in the next chapter. </p> <p>Figure 1 shows the inheritance structure of the classes discussed in this chapter. Class <a href="/doc-static/version/25.02/libraries/parse/reference/l_interface_chart" class="wiki_external">L_INTERFACE</a> has also been included although we will only study it in the <a href="/doc/solutions/EiffelParse_Tutorial" class="wiki_link">EiffelParse Tutorial</a>; it belongs to the Parse library, where it takes care of the interface between parsing and lexical analysis. </p> <p><a href="/doc-image/figure1"><img src="/doc-image/solutions/_images/figure1.png" border="0"/></a> </p> <p>Figure 1: Lexical classes </p> <a id="AIMS_AND_SCOPE_OF_THE_EIFFELLEX_LIBRARY"></a><h2>AIMS AND SCOPE OF THE EIFFELLEX LIBRARY</h2> <p>To use the EiffelLex library it is necessary to understand the basic concepts and terminology of lexical analysis. </p> <a id="Basic_terminology"></a><h3>Basic terminology</h3> <p>The set of tokens accepted by a lexical analyzer is called a <strong>lexical grammar</strong>. For example, the basic constructs of Eiffel (identifiers, keywords, constants, special symbols) constitute a lexical grammar. For reasons that will be clear below, a lexical grammar is also known as a <strong>regular grammar</strong>. </p> <p>A lexical grammar defines a number of <strong>token types</strong>, such as Identifier and Integer for Eiffel. A token that conforms to the structure defined for a certain token type is called a <strong>specimen</strong> of that token type. For example, the token my_identifier, which satisfies the rules for Eiffel tokens, is a specimen of the token type Identifier; 201 is a specimen of the token type Integer. </p> <p>To define a lexical grammar is to specify a number of token types by describing precisely, for each token type, the form of the corresponding specimens. For example a lexical grammar for Eiffel will specify that Identifier is the token type whose specimens are sequences of one or more characters, of which the first must be a letter (lower-case or upper-case) and any subsequent one is a letter, a digit (0 to 9) or an underscore. Actual grammar descriptions use a less verbose and more formal approach, studied below: regular expressions. </p> <p>A lexical analyzer is an object equipped with operations that enable it to read a text according to a known lexical grammar and to identify the text's successive tokens. </p> <p>The classes of the EiffelLex library make it possible to define lexical grammars for many different applications, and to produce lexical analyzers for these grammars. </p> <a id="Overview_of_the_classes"></a><h3>Overview of the classes</h3> <p>For the user of the EiffelLex library, the classes of most direct interest are <a href="/doc-static/version/25.02/libraries/lex/reference/token_chart" class="wiki_external">TOKEN</a> , <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> , <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> and <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> . </p> <p>An instance of <a href="/doc-static/version/25.02/libraries/lex/reference/token_chart" class="wiki_external">TOKEN</a> describes a token read from an input file being analyzed, with such properties as the token type, the corresponding string and the position in the text (line, column) where it was found. </p> <p>An instance of <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> is a lexical analyzer for a certain lexical grammar. Given a reference to such an instance, say analyzer, you may analyze an input text through calls to the features of class <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> , for example: <code> analyzer.get_token</code> </p> <p>Class <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> defines facilities for building such lexical analyzers. In particular, it provides features for reading the grammar from a file and building the corresponding analyzer. Classes that need to build and use lexical analyzers may be written as descendants of <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> to benefit from its general-purpose facilities. </p> <p>Class <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> is one such descendant of <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> . It contains all the facilities needed to build an ordinary lexical analyzer and apply it to the analysis of input texts. Because these facilities are simpler to use and are in most cases sufficient, SCANNING will be discussed first; the finer-grain facilities of <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> are described towards the end of this chapter. </p> <p>These classes internally rely on others, some of which may be useful for more advanced applications. <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> , one of the supporting classes, will be introduced after <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> . </p> <a id="Library_example"></a><h3>Library example</h3> <p>The EiffelStudio delivery includes (in the examples/library/lex subdirectory) a simple example using the EiffelLex library classes. The example applies EiffelLex library facilities to the analysis of a language which is none other than Eiffel itself. </p> <p>The root class of that example, <eiffel class="inline">EIFFEL_SCAN</eiffel>, is only a few lines long; it relies on the general mechanism provided by <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> (see below). The actual lexical grammar is given by a lexical grammar file (a concept explained below): the file of name eiffel_regular in the same directory. </p> <a id="Dealing_with_finite_automata"></a><h3>Dealing with finite automata</h3> <p>Lexical analysis relies on the theory of finite automata. The most advanced of the classes discussed in this chapter, <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> , relies on classes describing various forms of automata: </p> <ul><li> <a href="/doc-static/version/25.02/libraries/lex/reference/dfa_chart" class="wiki_external">DFA</a> : deterministic finite automata.</li> <li> <a href="/doc-static/version/25.02/libraries/lex/reference/pdfa_chart" class="wiki_external">PDFA</a> : partially deterministic finite automata.</li> <li> <a href="/doc-static/version/25.02/libraries/lex/reference/ndfa_chart" class="wiki_external">NDFA</a> : non-deterministic finite automata.</li> <li> <a href="/doc-static/version/25.02/libraries/lex/reference/automaton_chart" class="wiki_external">AUTOMATON</a> , the most general: finite automata.</li> <li> <a href="/doc-static/version/25.02/libraries/lex/reference/fixed_automaton_chart" class="wiki_external">FIXED_AUTOMATON</a> , <a href="/doc-static/version/25.02/libraries/lex/reference/linked_automaton_chart" class="wiki_external">LINKED_AUTOMATON</a> .</li> </ul> <p>These classes may also be useful for systems that need to manipulate finite automata for applications other than lexical analysis. The interface of <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> , which includes the features from <a href="/doc-static/version/25.02/libraries/lex/reference/automaton_chart" class="wiki_external">AUTOMATON</a> , <a href="/doc-static/version/25.02/libraries/lex/reference/ndfa_chart" class="wiki_external">NDFA</a> and <a href="/doc-static/version/25.02/libraries/lex/reference/pdfa_chart" class="wiki_external">PDFA</a> , will provide the essential information.</p> <a id="TOKENS"></a><h2>TOKENS</h2> <p>A lexical analyzer built through any of the techniques described in the rest of this chapter will return tokens - instances of class <a href="/doc-static/version/25.02/libraries/lex/reference/token_chart" class="wiki_external">TOKEN</a> . Here are the most important features of this class:</p> <ul><li> <eiffel class="inline">string_value</eiffel>: a string giving the token's contents.</li> <li> <eiffel class="inline">type</eiffel>: an integer giving the code of the token's type. The possible token types and associated integer codes are specified during the process of building the lexical analyzer in one of the ways described below.</li> <li> <eiffel class="inline">is_keyword</eiffel>: a boolean indicating whether the token is a keyword.</li> <li> <eiffel class="inline">keyword_code</eiffel>: an integer, meaningful only if <eiffel class="inline">is_keyword</eiffel> is <eiffel class="inline">True</eiffel>, and identifying the keyword by the code that was given to it during the process of building the analyzer.</li> <li> <eiffel class="inline">line_number</eiffel>, <eiffel class="inline">column_number</eiffel>: two integers indicating where the token appeared in the input text.</li> </ul> <a id="BUILDING_AND_USING_LEXICAL_ANALYZERS"></a><h2>BUILDING AND USING LEXICAL ANALYZERS</h2> <p>The general method for performing lexical analysis is the following.</p> <ol><li> Create an instance of <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> , giving a lexical analyzer for the desired grammar.</li> <li> Store the analyzer into a file.</li> <li> Retrieve the analyzer from the file.</li> <li> Use the analyzer to analyze the tokens of one or more input texts by calling the various features of class <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> on this object.</li> </ol> <p>Steps 2 and 3 are obviously unnecessary if this process is applied as a single sequence. But in almost all practical cases you will want to use the same grammar to analyze many different input texts. Then steps 1 and 2 will be performed once and for all as soon as the lexical grammar is known, yielding an instance of <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> that step 2 stores into a file; then in every case that requires analyzing a text you will simply retrieve the analyzer and apply it, performing steps 3 and 4 only.</p> <p>The simplest way to store and retrieve the instance of <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> and all related objects is to use the facilities of class <a href="/doc-static/version/25.02/libraries/base/reference/storable_chart" class="wiki_external">STORABLE</a> : procedure store and one of the retrieval procedures. To facilitate this process, <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> inherits from <a href="/doc-static/version/25.02/libraries/base/reference/storable_chart" class="wiki_external">STORABLE</a> .</p> <p>The next sections explain how to perform these various steps. In the most common case, the best technique is to inherit from class <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , which provides a framework for retrieving an analyzer file if it exists, creating it from a grammar description otherwise, and proceed with the lexical analysis of one or more input texts.</p> <a id="LEXICAL_GRAMMAR_FILES_AND_CLASS_SCANNING"></a><h2>LEXICAL GRAMMAR FILES AND CLASS SCANNING</h2> <p>Class <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> may be used as an ancestor by classes that need to perform lexical analysis. When using <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> you will need a <strong>lexical grammar file</strong> that contains the description of the lexical grammar. Since it is easy to edit and adapt a file without modifying the software proper, this technique provides flexibility and supports the incremental development and testing of lexical analyzers. </p> <a id="The_build_procedure"></a><h3>The build procedure</h3> <p>To obtain a lexical analyzer in a descendant of class <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , use the procedure<code> build (store_file_name, grammar_file_name: STRING)</code></p> <p>If no file of name <code class="inline">store_file_name</code> exists, then <eiffel class="inline">build</eiffel> reads the lexical grammar from the file of name <code class="inline">grammar_file_name</code>, builds the corresponding lexical analyzer, and stores it into <code class="inline">store_file_name</code>. </p> <p>If there already exists a file of name <code class="inline">grammar_file_name</code>, <eiffel class="inline">build</eiffel> uses it to recreate an analyzer without using the <code class="inline">grammar_file_name </code>. </p> <a id="Lexical_grammar_files"></a><h3>Lexical grammar files</h3> <p>A lexical grammar file (to be used as second argument to <eiffel class="inline">build</eiffel>, corresponding to <code class="inline">grammar_file_name</code>) should conform to a simple structure, of which the file <em>eiffel_regular</em> in the examples directory provides a good illustration. </p> <p>Here is the general form:<code>Token_type_1 Regular_expression_1 Token_type_2 Regular_expression_2 ... Token_type_m Regular_expression_m -- Keywords Keyword_1 Keyword_2 ... Keyword_n </code></p> <p>In other words: one or more lines, each containing the name of a token type and a <strong>regular expression</strong>; a line beginning with two dashes -- (the word <strong>Keywords</strong> may follow them to signal that this is the beginning of keywords); and one or more lines containing one keyword each. </p> <p>Each <em>Token_type_i</em> is the name of a token type, such as <em>Identifier</em> or <em>Decimal_constant</em>. Each <em>Regular_expression_i</em> is a regular expression, built according to a precisely specified format. That format is defined later in this chapter, but even without having seen that definition it is not hard to understand the following small and typical example of lexical grammar file without keywords: <code>Decimal '0'..'9' Natural +('0'..'9') Integer ['+'|'-'] '1'..'9' *('0'..'9')</code></p> <p>The first expression describes a token type whose specimens are tokens made of a single-letter decimal digit (any character between 0 and 9). In the second, the + sign denotes repetition (one or more); the specimens of the corresponding token type are all non-empty sequences of decimal digits - in other words, natural numbers, with leading zeroes permitted. In the third, the | symbol denotes alternation, and the asterisk denotes repetition (zero or more); the corresponding tokens are possibly signed integer constants, with no leading zeroes.</p> <p>As explained below, keywords are regular expressions which are treated separately for convenience and efficiency. If you are using lexical grammar files of the above form, all keywords must be specimens of the last regular expression given ( <em>Regular_expression_m</em> above). More details below. </p> <a id="Using_a_lexical_analyzer"></a><h3>Using a lexical analyzer</h3> <p>Once <eiffel class="inline">build</eiffel> has given you an analyzer, you may use it to analyze input texts through calls to the procedure<code> analyze (input_file_name: STRING)</code></p> <p>This will read in and process successive input tokens. Procedure <eiffel class="inline">analyze</eiffel> will apply to each of these tokens the action of procedure <eiffel class="inline">do_a_token</eiffel>. As defined in SCANNING, this procedure prints out information on the token: its string value, its type, whether it is a keyword and if so its code. You may redefine it in any descendant class so as to perform specific actions on each token.</p> <p>The initial action <eiffel class="inline">begin_analysis</eiffel>, which by default prints a header, and the terminal action <eiffel class="inline">end_analysis</eiffel>, which by default does nothing, may also be redefined.</p> <p>To build lexical analyzers which provide a higher degree of flexibility, use <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> or <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> , as described in the last part of this chapter.</p> <a id="ANALYZING_INPUT"></a><h2>ANALYZING INPUT</h2> <p>Let us look more precisely at how we can use a lexical analyzer to analyze an input text.</p> <a id="Class_LEXICAL"></a><h3>Class LEXICAL</h3> <p>Procedure <eiffel class="inline">analyze</eiffel> takes care of the most common needs of lexical analysis. But if you need more advanced lexical analysis facilities you will need an instance of class <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> (a direct instance of <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> itself or of one of its proper descendants). If you are using class <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> as described above, you will have access to such an instance through the attribute <eiffel class="inline">analyzer</eiffel>.</p> <p>This discussion will indeed assume that you have an entity attached to an instance of <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> . The name of that entity is assumed to be <eiffel class="inline">analyzer</eiffel>, although it does not need to be the attribute from <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> . You can apply to that <eiffel class="inline">analyzer</eiffel> the various exported features features of class <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> , explained below. All the calls described below should use <eiffel class="inline">analyzer</eiffel> as their target, as in<code> analyzer.set_file ("my_file_name")</code></p> <a id="Creating,_retrieving_and_storing_an_analyzer"></a><h3>Creating, retrieving and storing an analyzer</h3> <p>To create a new analyzer, use<code> create analyzer.make_new</code></p> <p>You may also retrieve an analyzer from a previous session. <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> is a descendant from <a href="/doc-static/version/25.02/libraries/base/reference/storable_chart" class="wiki_external">STORABLE</a> , so you can use feature retrieved for that purpose. In a descendant of <a href="/doc-static/version/25.02/libraries/base/reference/storable_chart" class="wiki_external">STORABLE</a> , simply write<code> analyzer ?= retrieved</code></p> <p>If you do not want to make the class a descendant of <a href="/doc-static/version/25.02/libraries/base/reference/storable_chart" class="wiki_external">STORABLE</a> , use the creation procedure <eiffel class="inline">make</eiffel> of <a href="/doc-static/version/25.02/libraries/lex/reference/lexical_chart" class="wiki_external">LEXICAL</a> , not to be confused with <eiffel class="inline">make_new</eiffel> above:<code> create analyzer.make analyzer ?= analyzer.retrieved</code></p> <a id="Choosing_a_document"></a><h3>Choosing a document</h3> <p>To analyze a text, call <eiffel class="inline">set_file</eiffel> or <eiffel class="inline">set_string</eiffel> to specify the document to be parsed. With the first call, the analysis will be applied to a file; with the second, to a string.</p> <p><p class="tpl note-message"><a href="/doc-image/LogoInformation"><img src="/doc-image/25.02/_images/tpl_Information.png" border="0" width="24" alt=""/></a> <strong>Note: </strong>if you use procedure <eiffel class="inline">analyze</eiffel> of <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , you do not need any such call, since <eiffel class="inline">analyze</eiffel> calls <eiffel class="inline">set_file</eiffel> on the file name passed as argument. </p> </p> <a id="Obtaining_the_tokens"></a><h3>Obtaining the tokens</h3> <p>The basic procedure for analyzing successive tokens in the text is <eiffel class="inline">get_token</eiffel>, which reads in one token and sets up various attributes of the analyzer to record properties of that token:</p> <ul><li> <eiffel class="inline">last_token</eiffel>, a function of type <a href="/doc-static/version/25.02/libraries/lex/reference/token_chart" class="wiki_external">TOKEN</a> , which provides all necessary information on the last token read.</li> <li> <eiffel class="inline">token_line_number</eiffel> and<eiffel class="inline"> token_column_number</eiffel>, to know where the token is in the text. These queries return results of type <eiffel class="inline">INTEGER</eiffel>.</li> <li> <eiffel class="inline">token_type</eiffel>, giving the regular expression type, identified by its integer number (which is the value <eiffel class="inline">No_token</eiffel> if no correct token was recognized).</li> <li> <eiffel class="inline">other_possible_tokens</eiffel>, an array giving all the other possible token types of the last token. (If <eiffel class="inline">token_type</eiffel> is <eiffel class="inline">No_token</eiffel> the array is empty.)</li> <li> <eiffel class="inline">end_of_text</eiffel>, a boolean attribute used to record whether the end of text has been reached. If so, subsequent calls to <eiffel class="inline">get_token</eiffel> will have no effect.</li> </ul> <p>Procedure <eiffel class="inline">get_token</eiffel> recognizes the longest possible token. So if <code class="inline"><</code>, <code class="inline">=</code> and <code class="inline"><=</code> are all regular expressions in the grammar, the analyzer recognizes <code class="inline"><=</code> as one token, rather than <code class="inline"><</code> followed by <code class="inline">=</code>. You can use <eiffel class="inline">other_possible_tokens</eiffel> to know what shorter tokens were recognized but not retained.</p> <p>If it fails to recognize a regular expression, <eiffel class="inline">get_token</eiffel> sets <eiffel class="inline">token_type</eiffel> to <eiffel class="inline">No_token</eiffel> and advances the input cursor by one character.</p> <a id="The_basic_scheme"></a><h3>The basic scheme</h3> <p>Here is the most common way of using the preceding facilities:<code> from set_file ("text_directory/text_to_be_parsed") -- Or: set_string ("string to parse") begin_analysis until end_of_text loop analyzer.get_token if analyzer.token_type = No_token then go_on end do_a_token (lexical.last_token) end end_analysis</code></p> <p>This scheme is used by procedure <eiffel class="inline">analyze</eiffel> of class <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , so that in standard cases you may simply inherit from that class and redefine procedures <eiffel class="inline">begin_analysis</eiffel>, <eiffel class="inline">do_a_token</eiffel>, and <eiffel class="inline">end_analysis</eiffel>. If you are not inheriting from <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , these names simply denote procedures that you must provide.</p> <a id="REGULAR_EXPRESSIONS"></a><h2>REGULAR EXPRESSIONS</h2> <p>The EiffelLex library supports a powerful set of construction mechanisms for describing the various types of tokens present in common languages such as programming languages, specification languages or just text formats. These mechanisms are called <strong>regular expressions</strong>; any regular expression describes a set of possible tokens, called the <strong>specimens</strong> of the regular expression. </p> <p>Let us now study the format of regular expressions. This format is used in particular for the lexical grammar files needed by class <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> and (as seen below) by procedure <eiffel class="inline">read_grammar</eiffel> of class <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> . The <em>eiffel_regular</em> grammar file in the examples directory provides an extensive example. </p> <p>Each regular expression denotes a set of tokens. For example, the first regular expression seen above, <br/></p> <p><code> '0'..'9'</code><br/>denotes a set of ten tokens, each consisting of a single digit. </p> <a id="Basic_expressions"></a><h3>Basic expressions</h3> <p>A character expression, written <em> 'character' </em> where <em>character</em> is a single character, describes a set of tokens with just one element: the one-character token character. For example, <em> '0' </em> describes the set containing the single-digit single token <em>0</em>. </p> <p>Cases in which character is not a printable character use the following conventions: <table border="1"><tr><td> '\ooo</td><td> Character given by its three-digit octal code <em>ooo</em>. </td></tr> <tr><td> '\xx</td><td> Character given by its two-digit hexadecimal code <em>xx</em>. <br/> (Both lower- and upper-case may be used for letters in <em>xx</em>.) </td></tr> <tr><td> '\r</td><td> Carriage return</td></tr> <tr><td> '\'</td><td> Single quote</td></tr> <tr><td> '\\</td><td> Backslash</td></tr> <tr><td> '\t</td><td> Tabulation</td></tr> <tr><td> '\n</td><td> New line</td></tr> <tr><td> '\b</td><td> Backspace</td></tr> <tr><td> '\f</td><td> Form feed</td></tr> </table></p> <a id="Intervals"></a><h3>Intervals</h3> <p>An interval, written <em>lower..upper</em> where <em>lower</em> and <em>upper</em> are character expressions, describes a set of one-character tokens: all the characters whose ASCII code is between the codes for the characters in <em>lower</em> and <em>upper</em>. For example, <em> '0'..'9' </em> contains all tokens made of a single decimal digit. </p> <a id="Basic_operator_expressions"></a><h3>Basic operator expressions</h3> <p>A parenthesized expression, written (<em>exp</em>) where <em>exp</em> is a regular expression, describes the same set of tokens as <em>exp</em>. This serves to remove ambiguities in complex regular expressions. For example, the parenthesized expression (<em> '0'..'9' </em>) also describes all single-decimal-digit tokens. </p> <p>A difference, written <em>interval - char</em>, where <em>interval</em> is an interval expression and <em>char</em> is a character expression, describes the set of tokens which are in <em>exp</em> but not in <em>char</em>. For example, the difference <em> '0'..'9' - '4' </em> describes all single-decimal-digit tokens except those made of the digit 4. </p> <p><p style="margin-left: 10px; margin-right: 50px; border: 1px solid #FFB55F; padding: 10px; background-color: #FFEEBF; color: black;"><a href="/doc-image/LogoWarning"><img src="/doc-image/25.02/_images/tpl_Warning.png" border="0" width="24" alt=""/></a> <strong>Caution:</strong> A difference may only apply to an interval and a single character. </p> </p> <a id="Iterations"></a><h3>Iterations</h3> <p>An unbounded iteration, written <em>*exp</em> or <em>+exp</em> where <em>exp</em> is a regular expression, describes the set of tokens made of sequences of zero or more specimens of <em>exp</em> (in the first form, using the asterisk), or of one or more specimens of <em>exp</em> (in the second form, using the plus sign). For example, the iteration <em>+('0'..'9')</em> describes the set of tokens made of one or more consecutive decimal digits. </p> <p>A fixed iteration, written <em>n exp</em> where <em>n</em> is a natural integer constant and <em>exp</em> is a regular expression, describes the set of tokens made of sequences of exactly <em>n</em> specimens of <em>exp</em>. For example, <em>3 ('A'..'Z')</em> describes the set of all three-letter upper-case tokens. </p> <a id="Other_operator_expressions"></a><h3>Other operator expressions</h3> <p>A concatenation, written exp<sub>1</sub> exp<sub>2</sub> ... exp<sub>n</sub>, describes the set of tokens made of a specimen of exp<sub>1</sub> followed by a specimen of exp<sub>2</sub> etc. For example, the concatenation <em> '1'..'9' * ('0'..'9')</em> describes the set of tokens made of one or more decimal digits, not beginning with a zero - in other words, integer constants in the usual notation. </p> <p>An optional component, written <em>[exp]</em> where <em>exp</em> is a regular expression, describes the set of tokens that includes the empty token and all specimens of <em>exp</em>. Optional components usually appear in concatenations. </p> <p>Concatenations may be inconvenient when the concatenated elements are simply characters, as in <em> 'A' ' ' 'T' 'e' 'x' 't' </em>. In this case you may use a <strong>string</strong> in double quotes, as in <br/><code> "A Text"</code></p> <p>More generally, a string is written "a<sub>1</sub> a<sub>2</sub> ... a<sub>n</sub>" for <em>n >= 0</em>, where the "a<sub>i</sub>" are characters, and is an abbreviation for the concatenation 'a<sub>1</sub>' 'a<sub>2</sub>' ... 'a<sub>n</sub>', representing a set containing a single token. In a string, the double quote character " is written \" and the backslash character \ is written \\. No other special characters are permitted; if you need special characters, use explicit concatenation. As a special case, "" represents the set containing a single empty token. </p> <p>A union, written exp<sub>1</sub> | exp<sub>2</sub> | ... | exp<sub>n</sub>, describes the set of tokens which are specimens of exp<sub>1</sub>, or of exp<sub>2</sub>, etc. For example, the union <em>('a'..'z') | ('A'..'Z')</em> describes the set of single-letter tokens (lower-case or upper-case). </p> <a id="Predefined_expressions"></a><h3>Predefined expressions</h3> <p>A joker, written <strong>$?</strong>, describes the set of all tokens made of exactly one character. A joker is considered to be an interval expression, so that it may be the first operand of a difference operation. </p> <p>A printable, written <strong>$P</strong>, describes the set of all tokens made of exactly one printable character. </p> <p>A blank, written <strong>$B</strong>, describes the set of all tokens made of one or more specimens of the characters blank, new-line, carriage-return and tabulation. </p> <p>The following non-elementary forms are abbreviations for commonly needed regular expressions:<table border="1"><tr><td> Code</td><td> Equivalent expression</td><td> Role</td></tr> <tr><td> <strong>$L</strong> </td><td> <em> '\n' </em></td><td> New-line character</td></tr> <tr><td> <strong>$N</strong> </td><td> <em>+('0'..'9')</em> </td><td> Natural integer constants</td></tr> <tr><td> <strong>$R</strong> </td><td> <em> ['+'|'-'] +('0'..'9') '.' *('0'..'9')['e'|'E' ['+'|'-'] +('0'..'9')] </em> </td><td> Floating point constants</td></tr> <tr><td> <strong>$W</strong> </td><td> <em> +( </em>'$P<strong> - ' ' - '\t' - '\n' - '\r') <em> </em></strong></td><td> Words</td></tr> <tr><td> <strong>$Z</strong> </td><td> <em> ['+'|'-'] +('0'..'9') </em> </td><td> Possibly signed integer constants</td></tr> </table></p> <p>A delimited string, written <em>->string</em>, where <em>string</em> is of the form,"a<sub>1</sub> a<sub>2</sub> ... a<sub>n</sub>", represents the set of tokens made of any number of printable characters and terminated by <em>string</em>. One more form of regular expression, case-sensitive expressions, using the ~ symbol, will be introduced below. </p> <a id="Combining_expression-building_mechanisms"></a><h3>Combining expression-building mechanisms</h3> <p>You may freely combine the various construction mechanisms to describe complex regular expressions. Below are a few examples.<table border="1"><tr><td> <em> 'a'..'z' - 'c' - 'e' </em> </td><td> Single-lower-case-letter tokens, except <em>c</em> and <em>e</em>. </td></tr> <tr><td> <em>$? - '\007</em>' </td><td> Any single-character token except ASCII 007.</td></tr> <tr><td> <em>+('a'..'z')</em> </td><td> One or more lower-case letters.</td></tr> <tr><td> <em> ['+'|'-'] '1'..'9' *('0'..'9') </em> </td><td> Integer constants, optional sign, no leading zero.</td></tr> <tr><td> <em>->"*/"</em> </td><td> Any string up to and including an occurrence of */ <br/> (the closing symbol of a PL/I or C comment). </td></tr> <tr><td> <em>"\"" ->"\""</em> </td><td> Eiffel strings.</td></tr> </table></p> <a id="Dealing_with_keywords"></a><h3>Dealing with keywords</h3> <p>Many languages to be analyzed have keywords - or, more generally, "reserved words". Eiffel, for example, has reserved words such as <code class="inline">class</code> and <code class="inline">Result</code>. <p class="tpl note-message"><a href="/doc-image/LogoInformation"><img src="/doc-image/25.02/_images/tpl_Information.png" border="0" width="24" alt=""/></a> <strong>Note: </strong>in Eiffel terminology reserved words include keywords; a keyword is a marker playing a purely syntactical role, such as <code class="inline">class</code>. Predefined entities and expressions such as <code class="inline">Result</code> and <code class="inline">Current</code>, which have an associated value, are considered reserved words but not keywords. The present discussion uses the term "keyword" although it can be applied to all reserved words. </p> </p> <p>In principle, keywords could be handled just as other token types. In Eiffel, for example, one might treat each reserved words as a token type with only one specimen; these token types would have names such as Class or Then and would be defined in the lexical grammar file:</p> <p><em>Class</em> '<strong>c' 'l' 'a' 's' 's</strong>' <br/><em>Then</em> '<strong>t' 'h' 'e' 'n</strong>' <br/>... </p> <p>This would be inconvenient. To simplify the task of language description, and also to improve the efficiency of the lexical analysis process, it is usually preferable to treat keywords as a separate category.</p> <p>If you are using class SCANNING and hence a lexical grammar file, the list of keywords, if any, must appear at the end of the file, one per line, preceded by a line that simply reads</p> <p><strong>-- Keywords</strong> </p> <p>For example the final part of the example Eiffel lexical grammar file appears as:<code> ... Other token type definitions ... Identifier ~('a'..'z') *(~('a'..'z') | '_' | ('0'..'9')) -- Keywords alias all and as BIT BOOLEAN ... Other reserved words ...</code></p> <p><p style="margin-left: 10px; margin-right: 50px; border: 1px solid #FFB55F; padding: 10px; background-color: #FFEEBF; color: black;"><a href="/doc-image/LogoWarning"><img src="/doc-image/25.02/_images/tpl_Warning.png" border="0" width="24" alt=""/></a> <strong>Caution:</strong> Every keyword in the keyword section must be a specimen of one of the token types defined for the grammar, and that token type must be the last one defined in the lexical grammar file, just before the <strong>Keywords</strong> line. So in Eiffel where the keywords have the same lexical structure as identifiers, the last line before the keywords must be the definition of the token type <em>Identifier</em>, as shown above. </p> </p> <p><p class="tpl note-message"><a href="/doc-image/LogoInformation"><img src="/doc-image/25.02/_images/tpl_Information.png" border="0" width="24" alt=""/></a> <strong>Note: </strong>The rule that all keywords must be specimens of one token type is a matter of convenience and simplicity, and only applies if you are using SCANNING and lexical grammar files. There is no such restriction if you rely directly on the more general facilities provided by <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> or <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> . Then different keywords may be specimens of different regular expressions; you will have to specify the token type of every keyword, as explained later in this chapter. </p> </p> <a id="Case_sensitivity"></a><h3>Case sensitivity</h3> <p>By default, letter case is not significant for regular expressions and keywords. So if <em>yes</em> matches a token type defined by a regular expression, or is a keyword, the input values <em>Yes</em>, <em>yEs</em> and <em>yES</em> will all yield the same token or keyword. This also means that <em> 'a'..'z' </em> and <em> 'a'..'z' | 'A'..'Z' </em> describe the same set of tokens. </p> <p>The regular expression syntax introduced above offers a special notation to specify that a particular expression is case-sensitive: <em>~exp</em>, where <em>exp</em> is a regular expression. For example, <em>~('A'..'Z')</em> only covers single-upper-case-letter tokens. But for all other kinds of expression letter case is not taken into account. </p> <p>You may change this default behavior through a set of procedures introduced in class <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> and hence available in its descendants <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX </a> and <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> .</p> <p>To make subsequent regular expressions case-sensitive, call the procedure<code> distinguish_case</code></p> <p>To revert to the default mode where case is not significant, call the procedure<code> ignore_case</code></p> <p>Each of these procedures remains in effect until the other one is called, so that you only need one call to define the desired behavior.</p> <p>For keywords, the policy is less tolerant. A single rule is applied to the entire grammar: keywords are either all case-sensitive or all case-insensitive. To make all keywords case-sensitive, call<code> keywords_distinguish_case</code></p> <p>The inverse call, corresponding to the default rule, is<code> keywords_ignore_case</code></p> <p>Either of these calls must be executed before you define any keywords; if you are using <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , this means before calling procedure build. Once set, the keyword case-sensitivity policy cannot be changed.</p> <a id="USING_METALEX_TO_BUILD_A_LEXICAL_ANALYZER"></a><h2>USING METALEX TO BUILD A LEXICAL ANALYZER</h2> <p>(You may skip the rest of this chapter if you only need simple lexical facilities.)</p> <p>Class <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , as studied above, relies on a class <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> . In some cases, you may prefer to use the features of <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> directly. Since <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> inherits from <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> , anything you do with <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> can in fact be done with <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , but you may wish to stay with just <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> if you do not need the additional features of <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> .</p> <a id="Steps_in_using_METALEX"></a><h3>Steps in using METALEX</h3> <p><a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> has an attribute analyzer which will be attached to a lexical analyzer. This class provides tools for building a lexical analyzer incrementally through explicit feature calls; you can still use a lexical grammar file, but do not have to.</p> <p>The following extract from a typical descendant of <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> illustrates the process of building a lexical analyzer in this way:<code> Upper_identifier, Lower_identifier, Decimal_constant, Octal_constant, Word: INTEGER is unique ... distinguish_case keywords_distinguish_case put_expression("+('0'..'7'"), Octal_constant, "Octal") put_expression ("'a'..'z' *('a'..'z'|'0'..'9'|'_')", Lower_identifier, "Lower") put_expression ("'A'..'Z' *('A'..'Z'|'0'..'9'|'_' )", Upper_identifier, "Upper") dollar_w (Word) ... put_keyword ("begin", Lower_identifier) put_keyword ("end", Lower_identifier) put_keyword ("THROUGH", Upper_identifier) ... make_analyzer</code></p> <p>This example follows the general scheme of building a lexical analyzer with the features of <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> , in a class that will normally be a descendant of <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> :</p> <ol><li> Set options, such as case sensitivity.</li> <li> Record regular expressions.</li> <li> Record keywords (this may be interleaved with step 2.)</li> <li> "Freeze" the analyzer by a call to <eiffel class="inline">make_analyzer</eiffel>.</li> </ol> <p>To perform steps 2 to 4 in a single shot and generate a lexical analyzer from a lexical grammar file, as with <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> , you may use the procedure<code> read_grammar (grammar_file_name: STRING)</code></p> <p>In this case all the expressions and keywords are taken from the file of name <code class="inline">grammar_file_name</code> rather than passed explicitly as arguments to the procedures of the class. You do not need to call <eiffel class="inline">make_analyzer</eiffel>, since <eiffel class="inline">read_grammar</eiffel> includes such a call. </p> <p>The rest of this discussion assumes that the four steps are executed individually as shown above, rather than as a whole using <eiffel class="inline">read_grammar</eiffel>. </p> <a id="Recording_token_types_and_regular_expressions"></a><h3>Recording token types and regular expressions</h3> <p>As shown by the example, each token type, defined by a regular expression, must be assigned an integer code. Here the developer has chosen to use Unique constant values so as not to worry about selecting values for these codes manually, but you may select any values that are convenient or mnemonic. The values have no effect other than enabling you to keep track of the various lexical categories. Rather than using literal values directly, it is preferable to rely on symbolic constants, Unique or not, which will be more mnemonic.</p> <p>Procedure <eiffel class="inline">put_expression</eiffel> records a regular expression. The first argument is the expression itself, given as a string built according to the rules seen earlier in this chapter. The second argument is the integer code for the expression. The third argument is a string which gives a name identifying the expression. This is useful mostly for debugging purposes; there is also a procedure <eiffel class="inline">put_nameless_expression</eiffel> which does not have this argument and is otherwise identical to <eiffel class="inline">put_expression</eiffel>.</p> <p>Procedure <eiffel class="inline">dollar_w</eiffel> corresponds to the <strong>$W</strong> syntax for regular expressions. Here an equivalent call would have been <code> put_nameless_expression ( "$W" ,Word ) </code></p> <p>Procedure <eiffel class="inline">declare_keyword</eiffel> records a keyword. The first argument is a string containing the keyword; the second argument is the regular expression of which the keyword must be a specimen. The example shows that here - in contrast with the rule enforced by <a href="/doc-static/version/25.02/libraries/lex/reference/scanning_chart" class="wiki_external">SCANNING</a> - not all keywords need be specimens of the same regular expression. </p> <p>The calls seen so far record a number of regular expressions and keywords, but do not give us a lexical analyzer yet. To obtain a usable lexical analyzer, you must call<code> make_analyzer</code></p> <p>After that call, you may not record any new regular expression or keyword. The analyzer is usable through attribute <eiffel class="inline">analyzer</eiffel>. <p class="tpl note-message"><a href="/doc-image/LogoInformation"><img src="/doc-image/25.02/_images/tpl_Information.png" border="0" width="24" alt=""/></a> <strong>Note: </strong>for readers knowledgeable in the theory of lexical analysis: one of the most important effects of the call to <eiffel class="inline">make_analyzer</eiffel> is to transform the non-deterministic finite automaton resulting from calls such as the ones above into a deterministic finite automaton. </p> </p> <p>Remember that if you use procedure <eiffel class="inline">read_grammar</eiffel>, you need not worry about <eiffel class="inline">make_analyzer</eiffel>, as the former procedure calls the latter. Another important feature of class <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> is procedure <eiffel class="inline">store_analyzer</eiffel>, which stores the analyzer into a file whose name is passed as argument, for use by later lexical analysis sessions. To retrieve the analyzer, simply use procedure <eiffel class="inline">retrieve_analyzer</eiffel>, again with a file name as argument.</p> <a id="BUILDING_A_LEXICAL_ANALYZER_WITH_LEX_BUILDER"></a><h2>BUILDING A LEXICAL ANALYZER WITH LEX_BUILDER</h2> <p>To have access to the most general set of lexical analysis mechanisms, you may use class <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> , which gives you an even finer grain of control than <a href="/doc-static/version/25.02/libraries/lex/reference/metalex_chart" class="wiki_external">METALEX</a> . This is not necessary in simple applications.</p> <a id="Building_a_lexical_analyzer"></a><h3>Building a lexical analyzer</h3> <p><a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> enables you to build a lexical analyzer by describing successive token types and keywords. This is normally done in a descendant of <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> . For each token type, you call a procedure that builds an object, or <strong>tool</strong>, representing the associated regular expression. </p> <p>For the complete list of available procedures, refer to the flat-short form of the class; there is one procedure for every category of regular expression studied earlier in this chapter. Two typical examples of calls are:<code> interval ('a', 'z') -- Create an interval tool union (Letter, Underlined) -- Create a union tool </code></p> <p>Every such procedure call also assigns an integer index to the tool it creates; this number is available through the attribute <eiffel class="inline">last_created_tool</eiffel>. You will need to record it into an integer entity, for example <eiffel class="inline">Identifier</eiffel> or <eiffel class="inline">Letter</eiffel>. </p> <a id="An_example"></a><h3>An example</h3> <p>The following extract from a typical descendant of <a href="/doc-static/version/25.02/libraries/lex/reference/lex_builder_chart" class="wiki_external">LEX_BUILDER</a> illustrates how to create a tool representing the identifiers of an Eiffel-like language.<code> Identifier, Letter, Digit, Underlined, Suffix, Suffix_list: INTEGER build_identifier do interval ('a', 'z') Letter := last_created_tool interval ('0', '9') Digit := last_created_tool interval ('_', '_') Underlined := last_created_tool union (Digit, Underlined) Suffix := last_created_tool iteration (Suffix) Suffix_list := last_created_tool append (Letter, Suffix_list) Identifier := last_created_tool end</code></p> <p>Each token type is characterized by a number in the tool_list. Each tool has a name, recorded in <eiffel class="inline">tool_names</eiffel>, which gives a readable form of the corresponding regular expression. You can use it to check that you are building the right tool. </p> <a id="Selecting_visible_tools"></a><h3>Selecting visible tools</h3> <p>In the preceding example, only some of the tools, such as <eiffel class="inline">Identifier</eiffel>, are of interest to the clients. Others, such as <eiffel class="inline">Suffix</eiffel> and <eiffel class="inline">Suffix_list</eiffel>, only play an auxiliary role. </p> <p>When you create a tool, it is by default invisible to clients. To make it visible, use procedure <eiffel class="inline">select_tool</eiffel>. Clients will need a number identifying it; to set this number, use procedure <eiffel class="inline">associate</eiffel>. For example the above extract may be followed by:<code> select_tool (Identifier) associate (Identifier, 34) put_keyword ("class", Identifier) put_keyword ("end", Identifier) put_keyword ("feature", Identifier)</code></p> <p>If the analysis encounters a token that belongs to two or more different selected regular expressions, the one entered last takes over. Others are recorded in the array <eiffel class="inline">other_possible_tokens</eiffel>.</p> <p>If you do not explicitly give an integer value to a regular expression, its default value is its rank in <eiffel class="inline">tool_list</eiffel>.</p> </div> <div class="wdocs-nav"><div class="wdocs-nav-section">Back to <a href="/doc/solutions/EiffelLex" class="wdocs-folder">EiffelLex</a></div><div class="wdocs-uuid"><a href="/doc/uuid/9ea43bef-1483-fbf2-4791-2be6a31d394d">Permanent link</a></div> </div> <div class="wdocs-cache-info">cached: 02/26/2025 8:06:54.000 AM</div></div> <div class="roc-comments-ext"> <div id="remark42"></div> <script> var remark_config = { site_id: 'eiffel-org-comments', url: 'https://www.eiffel.org/doc/uuid/9ea43bef-1483-fbf2-4791-2be6a31d394d', // Replace PAGE_URL with your page's canonical URL variable max_shown_comments: 25, // optional param; if it isn't defined default value (15) will be used theme: 'dark', // optional param; if it isn't defined default value ('light') will be used }; (function() { var d = document, s = d.createElement('script'); s.src = 'https://remark.eiffel.org/web/embed.js'; // prepends this address with domain where remark42 is placed (d.head || d.body).appendChild(s); })(); </script> </div> </div> </div> </section> </main> <!-- Footer --> <footer id="footer"> <div class="container"> <nav class="footer-nav"> <ul class="grid-5 has-gutter"> <li class="one-sixth"><a href="https://www.eiffel.org/welcome">Welcome</a> <ul> <li><a href="https://www.eiffel.org/purpose">Purpose</a></li> <li><a href="https://www.eiffel.org/news">News</a></li> <li><a href="https://www.eiffel.org/updates">Updates</a></li> <li><a href="https://www.eiffel.org/forum">Forum</a></li> <li><a href="https://www.eiffel.org/community">Community</a></li> <li><a href="https://www.eiffel.org/contact">Contact</a></li> <li> <a href="/account/roc-login?destination=doc%2Fsolutions%2FEiffelLex_Tutorial">Sign in</a> </li> </ul> </li> <li class="one-sixth"><a href="https://www.eiffel.org/documentation">Documentation</a> <ul> <li><a href="https://www.eiffel.org/doc/eiffel">Eiffel</a></li> <li><a href="https://www.eiffel.org/doc/eiffelstudio">EiffelStudio</a></li> <li><a href="https://www.eiffel.org/doc/solutions">Solutions</a></li> <li><a href="https://www.eiffel.org/doc/glossary">Glossary</a></li> <li><a href="https://www.eiffel.org/doc/faqs">FAQs</a></li> <li><a href="https://www.eiffel.org/contribute">Contribute</a></li> </ul> </li> <li class="one-sixth"><a href="https://www.eiffel.org/resources">Resources</a> <ul> <li><a href="https://www.eiffel.org/resources/libraries">Libraries</a></li> <li><a href="https://www.eiffel.org/resources/tools">Tools</a></li> <li><a href="https://www.eiffel.org/resources/wish_list">Wish list</a></li> <li><a href="https://www.eiffel.org/resources/videos">Videos</a></li> <li><a href="https://www.eiffel.org/resources/follow_us">Follow us</a></li> </ul> </li> <li class=""> <div class="btn-holder"> <a class="btn btn-download" href="https://www.eiffel.org/downloads">Download Now</a> <a class="btn btn-tryonline" href="https://www.eiffel.org/try_eiffel">Try Eiffel Online</a> <a class="btn btn-contribute" href="https://www.eiffel.org/contribute">Contribute</a> <a class="btn btn-account" href="/account/roc-login?destination=doc%2Fsolutions%2FEiffelLex_Tutorial">Sign in</a> </div> </li> <li class="one-sixth"> <ul class="social-networks"> <li><a class="facebook" target="_blank" href="https://www.facebook.com/pages/Eiffel-Programming-Language/235981463124887">Facebook</a></li> <li><a class="youtube" target="_blank" href="http://www.youtube.com/user/EiffelLanguage">You Tube</a></li> <li><a class="twitter" target="_blank" href="https://twitter.com/Eiffel_Language">Twitter</a></li> </ul> </li> </ul> </nav> <!-- Block "built_with_eiffel" cached: 02/26/2025 9:05:57.000 PM --> <div style="float: right">Built with the Eiffel ROC CMS and the <a href="http://www.eiffelweb.org">EiffelWeb framework</a>.</div> </div> </footer> <script src="/theme/responsive-eiffel-org/js/wdownloads.js"></script> <script src="/theme/responsive-eiffel-org/js/home.js"></script> <link href="/theme/responsive-eiffel-org/js/google-code-prettify-eiffel/styles/lang-eiffel.css" type="text/css" rel="stylesheet" /> <script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script> <script src="/theme/responsive-eiffel-org/js/google-code-prettify-eiffel/src/lang-eiffel.js"></script> <script src="https://www.google.com/recaptcha/api.js" async defer></script> </div> </body> </html>