This repository has been archived on 2026-10-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/api/Hi.NcParsers.ParsingSyntaxs.Siemens.html
T

531 lines
32 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Namespace Hi.NcParsers.ParsingSyntaxs.Siemens | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Namespace Hi.NcParsers.ParsingSyntaxs.Siemens | HiAPI-C# 2025 ">
<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 &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<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.ParsingSyntaxs.Siemens">
<h1 id="Hi_NcParsers_ParsingSyntaxs_Siemens" data-uid="Hi.NcParsers.ParsingSyntaxs.Siemens" class="text-break">Namespace Hi.NcParsers.ParsingSyntaxs.Siemens</h1>
<div class="markdown level0 summary"></div>
<div class="markdown level0 conceptual"></div>
<div class="markdown level0 remarks"></div>
<h3 id="classes">
Classes
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensCallStatementSyntax.html">SiemensCallStatementSyntax</a></dt>
<dd><p>Captures a whole-line Siemens subprogram-call statement into
<code>Parsing.SiemensCall</code> for
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensSubProgramCallSyntax.html">SiemensSubProgramCallSyntax</a> to
resolve (inline the file) or safe-skip (structured warning, zero
motion). Two shapes are owned:</p>
<ul><li><b>Parenthesized call, any identifier</b> —
<code>HQ_FC(1,50,75,160)</code>, <code>L_39(0.000,0.000)</code>,
<code>HH_ROBOT(2)</code> → <code>{ "Name": "HQ_FC", "Args": ["1","50",…] }</code>.
The argument grammar (complete quoted runs admitted, quote-aware comma
split) is <a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensCycleCallSyntax.html">SiemensCycleCallSyntax</a>'s, reused verbatim.</li><li><b>Bare-word call</b> — <code>L9810</code>, <code>L_ZYM91</code>,
<code>HH_ROBOTOFF</code>, with an optional repeat count <code>L123 P3</code> →
<code>{ "Name": "L123", "P": 3 }</code>. Restricted to <code>L</code>-leading or
underscore-bearing identifiers on purpose: this syntax runs ahead of
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.FlagSyntax.html">FlagSyntax</a> and a generic bare-identifier capture would
steal TRAORI-class words before their consumers ever saw them — the
same underscore heuristic <a class="xref" href="Hi.NcParsers.Syntaxs.SiemensSyntaxUtil.html#Hi_NcParsers_Syntaxs_SiemensSyntaxUtil_NamedIdentPattern">NamedIdentPattern</a>
blessed for assignments (corpus named entities all carry an
underscore; controller vocabulary never does). On real Sinumerik any
bare identifier can be a by-name call; widening further is a
corpus-driven follow-up.</li></ul>
<p>
Placement: last of the dedicated statement owners and still before
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensQuotedStatementSyntax.html">SiemensQuotedStatementSyntax</a> — quoted arguments must
reach this capture (paired quotes ride inside the args body; a line
whose quotes do not pair falls through whole to the quarantine).
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensCallStatementSyntax.html#Hi_NcParsers_ParsingSyntaxs_Siemens_SiemensCallStatementSyntax_ExcludedNames">ExcludedNames</a> keeps this catch-all from re-owning
statements that belong elsewhere (default: <code>WRITE</code> stays with
the quoted-statement quarantine; control-flow words are reserved for
their future syntaxes). Whole-line anchored: a call mixed with other
tokens (<code>L9810 M8</code>) does not match and stays visible in the
unparsed warning.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensCycleCallSyntax.html">SiemensCycleCallSyntax</a></dt>
<dd><p>Captures whitelisted Siemens cycle calls of the shape
<code>NAME(arg1,arg2,…)</code> (or the bare <code>NAME</code> form) from the
unparsed line text into a <code>Parsing.NAME</code> sub-object holding the
verbatim positional argument strings:
<code>CYCLE832(0.05,_ORI_FINISH,0.8)</code> →
<code>Parsing.CYCLE832 = { &ldquo;Args&rdquo;: [&ldquo;0.05&rdquo;, &ldquo;_ORI_FINISH&rdquo;, &ldquo;0.8&rdquo;] }</code>.
Empty slots (<code>,,</code>) stay as empty strings; <code>NAME()</code> yields an
empty <code>Args</code> array; a bare <code>NAME</code> yields
<code>{ &ldquo;Bare&rdquo;: true }</code> (a marker — empty sub-objects would be swept
by intermediate <code>CleanupParsing</code> calls before the consumer runs).
A brand Logic syntax consumes the sub-object
(e.g. <a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensPathSmoothingSyntax.html">SiemensPathSmoothingSyntax</a>
for CYCLE832,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensCycle800TiltSyntax.html">SiemensCycle800TiltSyntax</a> for
CYCLE800).</p>
<p>
Strictly whitelist-based (<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensCycleCallSyntax.html#Hi_NcParsers_ParsingSyntaxs_Siemens_SiemensCycleCallSyntax_CycleNames">CycleNames</a>, default
<code>CYCLE832</code> + <code>CYCLE800</code>) — a generic <code>WORD(args)</code>
capture would eat OEM/unknown calls (<code>HQ_FC(...)</code>,
<code>L_39(...)</code>) whose safe-skip handling is a separate work item,
and every unlisted call deliberately stays whole in
<a class="xref" href="Hi.NcParsers.Keywords.IUnparsedTextDef.html#Hi_NcParsers_Keywords_IUnparsedTextDef_UnparsedText">UnparsedText</a> for the visible
<code>UnparsedText--Remaining</code> warning.
</p>
<p>
Must be placed early in the Parsing bundle — before the assignment
and tag-value syntaxes: argument tokens standing after <code>(</code> or
<code>,</code> (<code>_ORI_FINISH</code>, or axis-letter shapes like <code>V1</code>)
would otherwise be shredded by
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.NamedVarAssignmentSyntax.html">NamedVarAssignmentSyntax</a> / tag-value captures.
Quoted arguments are supported for CYCLE800's swivel-data-record
name (<code>CYCLE800(1,"TC1",…)</code>): the args body admits complete
<code>"…"</code> runs (which may hide <code>)</code> or <code>,</code>) and the
comma split is quote-aware; quotes are kept verbatim in the captured
arg string so the consumer distinguishes <code>"0"</code> (name) from
<code>0</code> (number). A line whose quotes do not pair falls through
whole to <a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensQuotedStatementSyntax.html">SiemensQuotedStatementSyntax</a>'s quarantine.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensDefStatementSyntax.html">SiemensDefStatementSyntax</a></dt>
<dd><p>Consumes Sinumerik variable declarations
(<code>DEF REAL _X_HOME=155.5, _SAFE_Z</code> / <code>DEF INT N_ST=3</code>) and
lowers each declared name into <code>Parsing.Assignments</code>: initialised
names carry their initialiser expression text (the Evaluation bundle
resolves and routes it into <code>Vars.Named</code> like any named
assignment), bare names carry <code>&ldquo;0&rdquo;</code> — Sinumerik default-initialises
numeric types to zero, so a later <code>G0 Z=_SAFE_Z</code> reads 0 instead of
failing vacant.</p>
<p>
Must run before <a class="xref" href="Hi.NcParsers.ParsingSyntaxs.NamedVarAssignmentSyntax.html">NamedVarAssignmentSyntax</a> in
the Parsing bundle: on a DEF line that syntax would capture
<code>_X_HOME=155.5</code> but strand <code>DEF REAL</code> (and the comma list) as
unparsed residue. Initialiser expressions are delimited by the
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensExpressionParser.html">SiemensExpressionParser</a> longest-valid-prefix rule, so
parenthesised arithmetic and whitespace survive; a non-numeric type or
unparsable initialiser leaves the whole statement untouched (visible as
residue) rather than half-consuming it.
</p>
<p>
<code>BOOL</code>/<code>CHAR</code> initialise to 0 like INT; <code>STRING</code>
declarations are not lowered (string values have no numeric store) —
the statement is consumed whole so it cannot shed ghost tokens. The
declaration itself leaves no Parsing record: the lowered Assignments
entries carry the entire semantic payload, and an inert record would
only re-surface as an Unconsumed residue.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensFrameStatementSyntax.html">SiemensFrameStatementSyntax</a></dt>
<dd><p>Captures a whole Siemens frame statement (<code>TRANS/ATRANS/ROT/AROT/
ROTS/AROTS/CROTS/SCALE/ASCALE/MIRROR/AMIRROR</code>, bare or with
arguments) into a <code>Parsing.&lt;keyword&gt;</code> sub-object.
Sinumerik requires frame instructions in a block of their own, so
the whole remaining line belongs to the statement.</p>
<p>
The consumed keywords (<code>TRANS/ATRANS/ROT/AROT/ROTS/AROTS</code> — see
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensProgrammableFrameSyntax.html">SiemensProgrammableFrameSyntax</a>)
are captured <b>structured</b>: each argument token becomes a
sub-key — glued axis words (<code>X0</code>, <code>Y90.</code>) and equals forms
(<code>RPL=45</code>, <code>Z=R5</code>) both supported. Literal values are
stored as JSON numbers; non-literal right-hand sides stay strings so
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a> resolves them
in the Evaluation stage (<code>AROT Z=R5</code> →
<code>Parsing.AROT = { "Z": "R5" }</code>). A token outside the modeled
grammar makes the <b>whole statement</b> fall back to the verbatim
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensFrameStatementSyntax.html#Hi_NcParsers_ParsingSyntaxs_Siemens_SiemensFrameStatementSyntax_StatementKey">StatementKey</a> capture — never a half-consumed line.
</p>
<p>
The remaining keywords (<code>CROTS/SCALE/ASCALE/MIRROR/AMIRROR</code>
— zero corpus occurrences, no simulation) keep the verbatim
<code>{ "Statement": "&lt;args&gt;" }</code> quarantine; the Logic consumer
reports them as recognized-but-not-simulated. Either way the axis
words are kept out of reach of the quote/context-blind tag-value
syntaxes below, which would otherwise mint them into
<code>Parsing.X/Y/Z</code> and let <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a>
turn a frame statement into a very real ghost rapid.
Deferred-but-unmodeled must mean "no transform yet", never
"extra motion".
</p>
<p>
Must be placed early in the Parsing bundle — after
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.BlockSkipSyntax.html">BlockSkipSyntax</a>, before every assignment / tag-value
syntax (the <code>ROT RPL=45</code> shape would otherwise feed
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.NamedVarAssignmentSyntax.html">NamedVarAssignmentSyntax</a>).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensGotoParsingSyntax.html">SiemensGotoParsingSyntax</a></dt>
<dd><p>Captures Siemens <code>GOTOF</code>/<code>GOTOB</code> jump statements whole into
<code>Parsing.SiemensGoto</code>. Four forms are recognised, mirroring the
Fanuc phrase-level split (<code>IF ... GOTO</code> is one phrase, not an IF
composed with a GOTO):</p>
<ul><li><code>GOTOF &lt;label&gt;</code> / <code>GOTOB &lt;label&gt;</code> —
unconditional forward / backward jump.</li><li><code>IF &lt;cond&gt; GOTOF &lt;label&gt;</code> /
<code>IF &lt;cond&gt; GOTOB &lt;label&gt;</code> — the Sinumerik
single-line conditional jump (no brackets around the condition).</li></ul>
<p>
Placement: inside the whole-statement owner group, after
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensRepeatParsingSyntax.html">SiemensRepeatParsingSyntax</a> and before
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensIfParsingSyntax.html">SiemensIfParsingSyntax</a> — the IF-jump forms carry a
strictly longer prefix than the block <code>IF &lt;cond&gt;</code> phrase,
so this owner must win first (the block-IF owner also refuses
GOTOF/GOTOB tails defensively). Must run before the assignment
syntaxes: <code>IF R1==1 GOTOF LBL1</code> would otherwise be shredded by
the assignment capture (its LHS grammar matches <code>R1</code> and the
first <code>=</code> of <code>==</code>).
</p>
<p>
The label is captured as written (<code>LBL1</code>, <code>MARKE_A</code>, or an
<code>N&lt;num&gt;</code> block number — both are legal Sinumerik jump
targets). The condition string is left for
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a>'s pass-2 tree
walk; <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensGotoSyntax.html">SiemensGotoSyntax</a>
consumes the section.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensIfParsingSyntax.html">SiemensIfParsingSyntax</a></dt>
<dd><p>Captures the Siemens block-conditional phrases whole into
<code>Parsing.SiemensIf</code>: <code>IF &lt;cond&gt;</code> (no brackets on
Sinumerik), <code>ELSE</code>, <code>ENDIF</code>. The single-line jump form
(<code>IF &lt;cond&gt; GOTOF &lt;label&gt;</code>) belongs to
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensGotoParsingSyntax.html">SiemensGotoParsingSyntax</a>, which runs immediately before
this owner; a GOTOF/GOTOB tail is additionally refused here so an
ordering drift degrades to a visible unparsed warning instead of a
silently mis-captured block-IF (the Fanuc <code>(?!GOTO\b)</code>
precedent).</p>
<p>
Placement: whole-statement owner group, before the assignment
syntaxes — a condition like <code>R1==1</code> would otherwise be shredded
by the assignment capture (LHS grammar matches <code>R1</code> plus the
first <code>=</code>). The condition string is left for
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a>'s pass-2 walk;
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensIfSyntax.html">SiemensIfSyntax</a> consumes the
section and decides the branch.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensLabelSyntax.html">SiemensLabelSyntax</a></dt>
<dd><p>Consumes a Siemens label at block start (<code>LBL1:</code> — identifier
followed by a colon, optionally after the <code>N</code> head index) into a
block-root <a class="xref" href="Hi.NcParsers.Keywords.Siemens.SiemensLabel.html">SiemensLabel</a> record. Labels are passive jump
targets: in the normal flow the record is pure bookkeeping (no motion,
no state), while <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensRepeatSyntax.html">SiemensRepeatSyntax</a>
uses this same syntax as its <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.LabelScanUtil.html">LabelScanUtil</a>
probe and matches candidates on <code>SiemensLabel.Name</code>. Writing the
record at the block root (not under <code>Parsing</code>) keeps the passive
token out of <a class="xref" href="Hi.NcParsers.InspectionSyntaxs.UnconsumedCheckSyntax.html">UnconsumedCheckSyntax</a>'s
audit without needing a Logic-layer consumer — mirroring how
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensDefStatementSyntax.html">SiemensDefStatementSyntax</a> leaves no <code>Parsing.Def</code>
entry behind.</p>
<p>
Anchored at the start of the remaining unparsed text, so a label
buried mid-line is not captured (Sinumerik allows one label per block,
at block start). Text after the colon stays in
<a class="xref" href="Hi.NcParsers.Keywords.IUnparsedTextDef.html#Hi_NcParsers_Keywords_IUnparsedTextDef_UnparsedText">UnparsedText</a> for the rest of the
pipeline — <code>LBL1: G1 X0</code> executes its trailing motion normally.
The probe usage requires this syntax to stay self-sufficient: it reads
only UnparsedText and never touches the dependency list.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensLoopParsingSyntax.html">SiemensLoopParsingSyntax</a></dt>
<dd><p>Captures the Siemens loop-construct phrases whole, one Parsing
section per construct family:</p>
<ul><li><code>WHILE &lt;cond&gt;</code> / <code>ENDWHILE</code> →
<code>Parsing.SiemensWhile</code>.</li><li><code>FOR &lt;var&gt; = &lt;start&gt; TO &lt;end&gt;</code> /
<code>ENDFOR</code> → <code>Parsing.SiemensFor</code>. The start expression is
stored as a single-entry <code>Init</code> map keyed by the variable name
— the evaluator's pass-2 tree walk rewrites values only, never
keys, so the loop variable's name survives even when it collides
with a set named variable. Literal start/end bounds are written as
numeric JSON values directly (writer decides the node type);
expressions stay strings for the evaluator.</li><li>bare <code>REPEAT</code> / <code>UNTIL &lt;cond&gt;</code> →
<code>Parsing.SiemensRepeatUntil</code>. Only the label-less form is
taken — <code>REPEAT LBL1 ...</code> is the P4 section repeat owned by
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensRepeatParsingSyntax.html">SiemensRepeatParsingSyntax</a>, which runs earlier in the
statement group.</li><li><code>LOOP</code> / <code>ENDLOOP</code> → <code>Parsing.SiemensLoop</code>.</li></ul>
<p>
Placement: whole-statement owner group, after
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensGotoParsingSyntax.html">SiemensGotoParsingSyntax</a> / <a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensIfParsingSyntax.html">SiemensIfParsingSyntax</a>
and before the assignment syntaxes — <code>FOR R1=0 TO 10</code> would
otherwise be shredded by the assignment capture (<code>R1=0</code> is a
legal assignment shape and the <code>TO 10</code> tail strands).
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensLoopSyntax.html">SiemensLoopSyntax</a> consumes all
four sections against its shared loop-frame stack.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensMcallSyntax.html">SiemensMcallSyntax</a></dt>
<dd><p>Captures a Siemens <code>MCALL</code> modal-call statement whole into a
<code>Parsing.MCALL</code> sub-object:
<code>MCALL CYCLE81(500.,327.9137,0.5,324.564,,,0,1,0)</code> →
<code>{ &ldquo;CycleName&rdquo;: &ldquo;CYCLE81&rdquo;, &ldquo;Args&rdquo;: [&quot;500.&quot;, …] }</code>; a bare
<code>MCALL</code> (modal cancel) → <code>{ &ldquo;Bare&rdquo;: true }</code>; a
parenthesis-less callee (<code>MCALL L123</code>) keeps
<code>CycleName</code> without <code>Args</code>. The Logic consumer
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensModalCycleSyntax.html">SiemensModalCycleSyntax</a>) maps the
supported <code>CYCLE8x</code> family onto the shared canned-cycle modal
machinery and warns on everything else.</p>
<p>
Whole-statement owner: MCALL lines are standalone in the corpus, and
owning the full statement keeps the cycle's positional arguments away
from the assignment / tag-value syntaxes (same shredding hazard as
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensCycleCallSyntax.html">SiemensCycleCallSyntax</a>, whose argument grammar —
including complete quoted runs — is reused verbatim). Must run
before <a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensCycleCallSyntax.html">SiemensCycleCallSyntax</a>: a whitelisted cycle name
after <code>MCALL</code> would otherwise be captured bare-of-context and
strand the <code>MCALLL</code> word. A line mixing MCALL with other tokens
does not match and falls through whole to the visible unparsed
warning.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensMsgSyntax.html">SiemensMsgSyntax</a></dt>
<dd><p>Consumes a Siemens <code>MSG(&ldquo;text&rdquo;)</code> operator display call (or the
bare <code>MSG()</code> clear form) from the unparsed line text into a
block-root <a class="xref" href="Hi.NcParsers.Keywords.Siemens.Msg.html">Msg</a> section, and surfaces the text as a
<code>Msg&ndash;Display</code> system message.</p>
<p>
Must be placed <b>before</b> every assignment / tag-value / flag
syntax in the Parsing bundle (right after
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.CommentSyntaxs.TailCommentSyntax.html">TailCommentSyntax</a> /
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.BlockSkipSyntax.html">BlockSkipSyntax</a>): the quoted argument routinely
contains NC-shaped tokens (<code>MSG("TOOL=5")</code>, <code>MSG("G54 OK")</code>,
<code>MSG("T20 R8.000 CR:2.500")</code>) which the quote-blind consumers
downstream would otherwise shred into ghost assignments, flags, or
axis words. Consuming the whole call here removes that hazard
structurally — the planned fix recorded on
<a class="xref" href="Hi.NcParsers.Syntaxs.NcSyntaxUtil.html">NcSyntaxUtil</a>'s assignment RHS-boundary notes.
</p>
<p>
Only the two literal forms are consumed: <code>MSG("...")</code> and
<code>MSG()</code>. Non-literal arguments (string concatenation
<code>MSG("A"&lt;&lt;R1)</code>, variable interpolation) are deliberately
left whole in <a class="xref" href="Hi.NcParsers.Keywords.IUnparsedTextDef.html#Hi_NcParsers_Keywords_IUnparsedTextDef_UnparsedText">UnparsedText</a> for the
visible <code>UnparsedText--Remaining</code> warning — half-eating them
would silently lose content.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensProcSyntax.html">SiemensProcSyntax</a></dt>
<dd><p>Consumes a Siemens <code>PROC</code> subprogram declaration header
(<code>PROC MY_SUB</code>, <code>PROC CONTOUR(REAL X, INT N) SAVE DISPLOF</code>)
whole into a block-root <a class="xref" href="Hi.NcParsers.Keywords.Siemens.SiemensProc.html">SiemensProc</a> record. The header
carries no executable state for the simulation — parameter binding to
caller arguments is a later work item — but leaving it unparsed would
shred the parameter list into ghost axis words the moment the
tag-value syntaxes run, so the whole statement is owned here. The
verbatim remainder after the name is preserved on
<a class="xref" href="Hi.NcParsers.Keywords.Siemens.SiemensProc.html#Hi_NcParsers_Keywords_Siemens_SiemensProc_Statement">Statement</a> for cache-dump readers. Writes at
the block root (no <code>Parsing</code> entry) following the
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensDefStatementSyntax.html">SiemensDefStatementSyntax</a> precedent — a record with no
Logic consumer must not land in the
<a class="xref" href="Hi.NcParsers.InspectionSyntaxs.UnconsumedCheckSyntax.html">UnconsumedCheckSyntax</a> audit tree.</p>
<p>
Anchored at statement start: Sinumerik requires <code>PROC</code> to be the
first statement of a subprogram file, so a mid-line <code>PROC</code> is
left alone (visible unparsed warning).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensQuotedStatementSyntax.html">SiemensQuotedStatementSyntax</a></dt>
<dd><p>Quote guard: any line text still carrying a double quote after the
literal-form consumers (<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensMsgSyntax.html">SiemensMsgSyntax</a>,
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensToolCallSyntax.html">SiemensToolCallSyntax</a>, <a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensCycleCallSyntax.html">SiemensCycleCallSyntax</a>)
have run is quarantined whole into
<code>Parsing.QuotedStatement = { &ldquo;Statement&rdquo;: &ldquo;&lt;verbatim&gt;&rdquo; }</code> —
<code>WRITE(ERROR,&ldquo;CUTTIME&rdquo;,&ldquo;T5 X100&rdquo;)</code>, string-concatenation
<code>MSG(&quot;...&quot;&lt;&lt;R1)</code>, quoted-argument cycles not yet whitelisted.</p>
<p>
Every quote-blind syntax below (flags, numbered flags, tag values,
assignments) opens a token boundary at the quote→letter transition,
so without this guard the string contents get minted into REAL parser
state: <code>"G54"</code> inside a WRITE argument silently switches the
active work offset, <code>"T5 X100"</code> mints a ghost tool call plus a
ghost motion. Quarantining keeps the whole statement visible as one
<code>Parsing--Unconsumed</code> entry (<code>QuotedStatement.Statement</code>)
with zero state changes — the same deferred-not-corrupted contract as
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensFrameStatementSyntax.html">SiemensFrameStatementSyntax</a>. Proper consumers (WRITE,
CYCLE800 quoted args) replace this guard per statement family later.
</p>
<p>
Trade-off, deliberate: on an exotic mixed block the guard also takes
the co-resident plain words (a motion word sharing the block with an
unconsumed quoted call goes into the quarantine too). Losing them is
visible in the warning text; minting false state would be silent —
never trade the first for the second. Corpus quoted statements
(WRITE, non-literal MSG) are standalone blocks.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensRepeatParsingSyntax.html">SiemensRepeatParsingSyntax</a></dt>
<dd><p>Captures a Siemens <code>REPEAT</code> statement whole into
<code>Parsing.SiemensRepeat</code>: <code>REPEAT LBL1 LBL0</code> →
<code>{ &ldquo;Start&rdquo;: &ldquo;LBL1&rdquo;, &ldquo;End&rdquo;: &ldquo;LBL0&rdquo; }</code>, with an optional trailing
repetition count (<code>P=3</code> or <code>P3</code>). The Evaluation consumer
(<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensRepeatSyntax.html">SiemensRepeatSyntax</a>) re-runs
the label-bounded section. The single-label form
(<code>REPEAT LBL1</code> — repeat from the label back to the REPEAT line)
is captured with <code>End</code> absent; the consumer currently warns it
unsupported (corpus count: zero).</p>
<p>
Whole-statement owner, anchored at statement start — mixing REPEAT
with other tokens on one block does not match and falls through whole
to the visible unparsed warning. The end-label alternative refuses a
<code>P</code>+digits word so <code>REPEAT LBL1 P3</code> reads as
start-label + count, not as an end label named <code>P3</code>.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensToolCallSyntax.html">SiemensToolCallSyntax</a></dt>
<dd><p>Consumes the Siemens string tool call <code>T=&ldquo;name&rdquo;</code> from the
unparsed line text into <code>Parsing.T</code> as a string value
(quotes stripped). Numeric concatenated calls (<code>T5</code>) stay with
the preset's <a class="xref" href="Hi.NcParsers.ParsingSyntaxs.IntegerTagValueSyntax.html">IntegerTagValueSyntax</a>;
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html">ToolChangeSyntax</a> accepts either shape.</p>
<p>
Must be placed <b>before</b> every tag-value syntax in the Parsing
bundle: tool names routinely contain NC-shaped tokens
(<code>T="D16R3Z6"</code> — quote-blind consumers would mint ghost
<code>Parsing.D</code>/<code>Parsing.Z</code> entries out of the name;
<code>(?&lt;=[0-9])</code> and quote→letter <code>\b</code> boundaries in
<a class="xref" href="Hi.NcParsers.SoftNcUtil.html#Hi_NcParsers_SoftNcUtil_RegexFlagPrefix">RegexFlagPrefix</a> both open inside the string).
Same structural-consumption rationale as
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensMsgSyntax.html">SiemensMsgSyntax</a>.
</p>
<p>
A second <code>T="..."</code> behind a <code>;</code> comment
(<code>T="M6LWXD-1301";T="M6LWX"</code>, real corpus shape) never reaches
this syntax — the quote-aware
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.CommentSyntaxs.TailCommentSyntax.html">TailCommentSyntax</a> runs earlier and strips
it. Tool names are matched verbatim, including non-ASCII bytes from
legacy code pages.
</p>
</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>