Archived
335 lines
16 KiB
HTML
335 lines
16 KiB
HTML
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>Class HeidenhainExpressionParser | HiAPI-C# 2025 </title>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="title" content="Class HeidenhainExpressionParser | HiAPI-C# 2025 ">
|
||
|
||
<meta name="description" content="Recursive-descent parser for Heidenhain klartext FN value expressions. Produces the same AST as the Fanuc so is reused unchanged. Pure: no variable lookup, no evaluation. Grammar (lowest precedence at top): expr := add-expr add-expr := term (('+' | '-') term)* term := factor (('*' | '/' | 'DIV') factor)* factor := ('+' | '-')? primary primary := number | '(' expr ')' | 'Q' digits | 'QR' digits | 'QL' digits | 'QS' digits | func primary → prefix form "SQRT 4" (FN 5) | func '(' arglist ')' → paren form "SQRT(Q2)" Dialect notes: Q-family tokens are canonicalised to uppercase (q1 → Q1) so Parsing.Assignments keys, table lookups and same-block references agree. (Caveat shared with the Siemens R canonicalisation: a lowercase-captured Assignments key keeps its raw spelling in the evaluator's same-block dictionary, so a later same-block reference resolves to the pre-block value instead — klartext posts emit uppercase, corpus-zero.) DIV is the FN 4 division spelling (FN 4: Q4 = +8 DIV +Q2) and maps onto the shared divide operator. Function names are limited to the klartext math vocabulary (SQRT SIN COS TAN ASIN ACOS ATAN ABS INT FRAC SGN NEG LN LOG EXP); INT normalises to the evaluator's FIX (truncate toward zero), names the shared evaluator lacks (FRAC/SGN/NEG/LOG) parse fine and fail soft at evaluation. Any other identifier is a parse error — klartext has no named variables, and rejecting bare words keeps the evaluator's Parsing-tree pass from touching non-expression strings (MM, MAX, tool-axis letters). Comparison/logical operators are deliberately absent: FN 9–12 jump conditions are pre-normalised by into separate value operands plus a shared comparison word — never parsed here.">
|
||
<link rel="icon" href="../img/HiAPI.favicon.ico">
|
||
<link rel="stylesheet" href="../public/docfx.min.css">
|
||
<link rel="stylesheet" href="../public/main.css">
|
||
<meta name="docfx:navrel" content="../toc.html">
|
||
<meta name="docfx:tocrel" content="toc.html">
|
||
|
||
<meta name="docfx:rel" content="../">
|
||
|
||
|
||
|
||
<meta name="loc:inThisArticle" content="In this article">
|
||
<meta name="loc:searchResultsCount" content="{count} results for "{query}"">
|
||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||
<meta name="loc:tocFilter" content="Filter by title">
|
||
<meta name="loc:nextArticle" content="Next">
|
||
<meta name="loc:prevArticle" content="Previous">
|
||
<meta name="loc:themeLight" content="Light">
|
||
<meta name="loc:themeDark" content="Dark">
|
||
<meta name="loc:themeAuto" content="Auto">
|
||
<meta name="loc:changeTheme" content="Change theme">
|
||
<meta name="loc:copy" content="Copy">
|
||
<meta name="loc:downloadPdf" content="Download PDF">
|
||
|
||
<script type="module" src="./../public/docfx.min.js"></script>
|
||
|
||
<script>
|
||
const theme = localStorage.getItem('theme') || 'auto'
|
||
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
|
||
</script>
|
||
|
||
</head>
|
||
|
||
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
|
||
<header class="bg-body border-bottom">
|
||
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
|
||
<div class="container-xxl flex-nowrap">
|
||
<a class="navbar-brand" href="../index.html">
|
||
<img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
|
||
|
||
</a>
|
||
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
|
||
<i class="bi bi-three-dots"></i>
|
||
</button>
|
||
<div class="collapse navbar-collapse" id="navpanel">
|
||
<div id="navbar">
|
||
<form class="search" role="search" id="search">
|
||
<i class="bi bi-search"></i>
|
||
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
</header>
|
||
|
||
<main class="container-xxl">
|
||
<div class="toc-offcanvas">
|
||
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
|
||
<div class="offcanvas-header">
|
||
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
|
||
</div>
|
||
<div class="offcanvas-body">
|
||
<nav class="toc" id="toc"></nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="content">
|
||
<div class="actionbar">
|
||
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
|
||
<i class="bi bi-list"></i>
|
||
</button>
|
||
|
||
<nav id="breadcrumb"></nav>
|
||
</div>
|
||
|
||
<article data-uid="Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser">
|
||
|
||
|
||
|
||
<h1 id="Hi_NcParsers_EvaluationSyntaxs_Heidenhain_HeidenhainExpressionParser" data-uid="Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser" class="text-break">
|
||
Class HeidenhainExpressionParser
|
||
</h1>
|
||
|
||
<div class="facts text-secondary">
|
||
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.NcParsers.html">NcParsers</a>.<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.html">EvaluationSyntaxs</a>.<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Heidenhain.html">Heidenhain</a></dd></dl>
|
||
<dl><dt>Assembly</dt><dd>HiMech.dll</dd></dl>
|
||
</div>
|
||
|
||
<div class="markdown summary"><p>Recursive-descent parser for Heidenhain klartext FN value expressions.
|
||
Produces the same <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Evaluation.NcExpr.html">NcExpr</a> AST as the Fanuc
|
||
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Evaluation.NcExpressionParser.html">NcExpressionParser</a> so <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Evaluation.NcExpressionEvaluator.html">NcExpressionEvaluator</a>
|
||
is reused unchanged. Pure: no variable lookup, no evaluation.</p>
|
||
<p>Grammar (lowest precedence at top):</p>
|
||
<pre><code class="lang-csharp">expr := add-expr
|
||
add-expr := term (('+' | '-') term)*
|
||
term := factor (('*' | '/' | 'DIV') factor)*
|
||
factor := ('+' | '-')? primary
|
||
primary := number
|
||
| '(' expr ')'
|
||
| 'Q' digits | 'QR' digits | 'QL' digits | 'QS' digits
|
||
| func primary → prefix form "SQRT 4" (FN 5)
|
||
| func '(' arglist ')' → paren form "SQRT(Q2)"</code></pre>
|
||
<p>
|
||
Dialect notes: Q-family tokens are canonicalised to uppercase
|
||
(<code>q1</code> → <code>Q1</code>) so <code>Parsing.Assignments</code> keys, table
|
||
lookups and same-block references agree. (Caveat shared with the
|
||
Siemens R canonicalisation: a lowercase-captured Assignments key
|
||
keeps its raw spelling in the evaluator's same-block dictionary, so
|
||
a later same-block reference resolves to the pre-block value instead
|
||
— klartext posts emit uppercase, corpus-zero.) <code>DIV</code> is the FN 4
|
||
division spelling (<code>FN 4: Q4 = +8 DIV +Q2</code>) and maps onto the
|
||
shared divide operator. Function names are limited to the klartext
|
||
math vocabulary (<code>SQRT SIN COS TAN ASIN ACOS ATAN ABS INT FRAC SGN
|
||
NEG LN LOG EXP</code>); <code>INT</code> normalises to the evaluator's
|
||
<code>FIX</code> (truncate toward zero), names the shared evaluator lacks
|
||
(<code>FRAC</code>/<code>SGN</code>/<code>NEG</code>/<code>LOG</code>) parse fine and fail
|
||
soft at evaluation. Any other identifier is a parse error — klartext
|
||
has no named variables, and rejecting bare words keeps the
|
||
evaluator's Parsing-tree pass from touching non-expression strings
|
||
(<code>MM</code>, <code>MAX</code>, tool-axis letters). Comparison/logical
|
||
operators are deliberately absent: FN 9–12 jump conditions are
|
||
pre-normalised by
|
||
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Heidenhain.HeidenhainGotoParsingSyntax.html">HeidenhainGotoParsingSyntax</a>
|
||
into separate value operands plus a shared comparison word — never
|
||
parsed here.
|
||
</p>
|
||
</div>
|
||
<div class="markdown conceptual"></div>
|
||
|
||
<div class="codewrapper">
|
||
<pre><code class="lang-csharp hljs">public sealed class HeidenhainExpressionParser</code></pre>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<dl class="typelist inheritance">
|
||
<dt>Inheritance</dt>
|
||
<dd>
|
||
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
|
||
<div><span class="xref">HeidenhainExpressionParser</span></div>
|
||
</dd>
|
||
</dl>
|
||
|
||
|
||
|
||
<dl class="typelist inheritedMembers">
|
||
<dt>Inherited Members</dt>
|
||
<dd>
|
||
<div>
|
||
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="typelist extensionMethods">
|
||
<dt>Extension Methods</dt>
|
||
<dd>
|
||
<div>
|
||
<a class="xref" href="Hi.Common.DuplicateUtil.html#Hi_Common_DuplicateUtil_TryDuplicate__1___0_System_Object___">DuplicateUtil.TryDuplicate<TSelf>(TSelf, params object[])</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__1___0_System_Action___0__">InvokeUtil.SelfInvoke<TSrc>(TSrc, Action<TSrc>)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__2___0_System_Func___0___1__">InvokeUtil.SelfInvoke<TSrc, TDst>(TSrc, Func<TSrc, TDst>)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="Hi.Coloring.ColorUtil.html#Hi_Coloring_ColorUtil_GetGloomyColor_System_Object_System_Double_System_Double_">ColorUtil.GetGloomyColor(object, double, double)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="Hi.Common.NameUtil.html#Hi_Common_NameUtil_GetSelectionName_System_Object_">NameUtil.GetSelectionName(object)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="Hi.Common.StringUtil.html#Hi_Common_StringUtil_GetPropertyStringIfToStringNotOverloaded_System_Object_System_Boolean_System_Boolean_">StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="Hi.Parallels.LockUtil.html#Hi_Parallels_LockUtil_Lock_System_Object_">LockUtil.Lock(object)</a>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
|
||
|
||
|
||
|
||
<h2 class="section" id="methods">Methods
|
||
</h2>
|
||
|
||
|
||
<a id="Hi_NcParsers_EvaluationSyntaxs_Heidenhain_HeidenhainExpressionParser_TryParse_" data-uid="Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser.TryParse*"></a>
|
||
|
||
<h3 id="Hi_NcParsers_EvaluationSyntaxs_Heidenhain_HeidenhainExpressionParser_TryParse_System_String_Hi_NcParsers_EvaluationSyntaxs_Evaluation_NcExpr__System_String__" data-uid="Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser.TryParse(System.String,Hi.NcParsers.EvaluationSyntaxs.Evaluation.NcExpr@,System.String@)">
|
||
TryParse(string, out NcExpr, out string)
|
||
|
||
</h3>
|
||
|
||
<div class="markdown level1 summary"><p>Parses <code class="paramref">source</code> requiring the whole string to be
|
||
consumed. On success, <code class="paramref">expr</code> is the AST and
|
||
<code class="paramref">error</code> is <code>null</code>. On failure,
|
||
<code class="paramref">expr</code> is <code>null</code> and <code class="paramref">error</code>
|
||
describes the syntax problem.</p>
|
||
</div>
|
||
<div class="markdown level1 conceptual"></div>
|
||
|
||
<div class="codewrapper">
|
||
<pre><code class="lang-csharp hljs">public static bool TryParse(string source, out NcExpr expr, out string error)</code></pre>
|
||
</div>
|
||
|
||
<h4 class="section">Parameters</h4>
|
||
<dl class="parameters">
|
||
<dt><code>source</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
|
||
<dd></dd>
|
||
<dt><code>expr</code> <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Evaluation.NcExpr.html">NcExpr</a></dt>
|
||
<dd></dd>
|
||
<dt><code>error</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
|
||
<dd></dd>
|
||
</dl>
|
||
|
||
<h4 class="section">Returns</h4>
|
||
<dl class="parameters">
|
||
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
|
||
<dd></dd>
|
||
</dl>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a id="Hi_NcParsers_EvaluationSyntaxs_Heidenhain_HeidenhainExpressionParser_TryParsePrefix_" data-uid="Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser.TryParsePrefix*"></a>
|
||
|
||
<h3 id="Hi_NcParsers_EvaluationSyntaxs_Heidenhain_HeidenhainExpressionParser_TryParsePrefix_System_String_Hi_NcParsers_EvaluationSyntaxs_Evaluation_NcExpr__System_Int32__System_String__" data-uid="Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser.TryParsePrefix(System.String,Hi.NcParsers.EvaluationSyntaxs.Evaluation.NcExpr@,System.Int32@,System.String@)">
|
||
TryParsePrefix(string, out NcExpr, out int, out string)
|
||
|
||
</h3>
|
||
|
||
<div class="markdown level1 summary"><p>Parses the longest valid expression prefix of <code class="paramref">source</code>.
|
||
On success, <code class="paramref">consumedLength</code> is the number of leading
|
||
characters that form the expression (trailing text from that offset on
|
||
is the caller's to keep, e.g. as remaining <code>UnparsedText</code>). Fails
|
||
only when not even a prefix parses — callers fall back to their legacy
|
||
lexical capture in that case. This is the parser-delimited RHS
|
||
boundary for <code>Q1 = Q1 - 1</code>-style assignments (whitespace inside
|
||
the expression, trailing non-expression words split correctly).</p>
|
||
</div>
|
||
<div class="markdown level1 conceptual"></div>
|
||
|
||
<div class="codewrapper">
|
||
<pre><code class="lang-csharp hljs">public static bool TryParsePrefix(string source, out NcExpr expr, out int consumedLength, out string error)</code></pre>
|
||
</div>
|
||
|
||
<h4 class="section">Parameters</h4>
|
||
<dl class="parameters">
|
||
<dt><code>source</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
|
||
<dd></dd>
|
||
<dt><code>expr</code> <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Evaluation.NcExpr.html">NcExpr</a></dt>
|
||
<dd></dd>
|
||
<dt><code>consumedLength</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
|
||
<dd></dd>
|
||
<dt><code>error</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
|
||
<dd></dd>
|
||
</dl>
|
||
|
||
<h4 class="section">Returns</h4>
|
||
<dl class="parameters">
|
||
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
|
||
<dd></dd>
|
||
</dl>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</article>
|
||
|
||
<div class="contribution d-print-none">
|
||
</div>
|
||
|
||
|
||
</div>
|
||
|
||
<div class="affix">
|
||
<nav id="affix"></nav>
|
||
</div>
|
||
</main>
|
||
|
||
<div class="container-xxl search-results" id="search-results"></div>
|
||
|
||
<footer class="border-top text-secondary">
|
||
<div class="container-xxl">
|
||
<div class="flex-fill">
|
||
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
</body>
|
||
</html>
|