Мне действительно не нравится отвечать на мой собственный вопрос, однако, поскольку это может спасти кого-то еще от горя, когда-нибудь я смогу.
Оказывается, что функции, предусмотренные в модуле синтаксического анализа, НЕ являются потокобезопасными.
Однако вы можете получить доступ к parseState
«переменной» типа IParseState
в своем нетерминальном действии.
Например (грубо, но работай со мной):
Если у вас нетерминал, такой как
%token<string> NAME
%%
Person:
NAME NAME { $1 (* action *) }
Генерируемый код:
(fun (parseState : Microsoft.FSharp.Text.Parsing.IParseState) ->
let _1 = (let data = parseState.GetInput(1) in
(Microsoft.FSharp.Core.Operators.unbox data : string)
) in
Microsoft.FSharp.Core.Operators.box((_1) : 'Person)
);
Таким образом, вы можете взаимодействовать с этим объектом parseState таким же образом.
%token<string> NAME
%%
Person:
NAME NAME { parseState.DoStuff(); }
Метод rhs_start_pos
в основном делает это:
let startPos,endPos = parseState.InputRange(n)
и symbol_end_pos
делает это:
let startSymb,endSymb = parseState.ResultRange
Надеюсь, это поможет