この問題は非常に単純だと思います。答えはあなたがしなければならないということです:
- 単語全体(
[a-z]+
)を小文字のみで解析します。
- 辞書に属しているかどうかを確認します。
keyword
もしそうなら、 ;を返します。そうしないと、パーサーはフォールバックします。
identifier
個別に解析します。
例(単なる架空のコードであり、テストされていません):
let keyWordSet =
System.Collections.Generic.HashSet<_>(
[|"while"; "begin"; "end"; "do"; "if"; "then"; "else"; "print"|]
)
let pKeyword =
(many1Satisfy isLower .>> nonAlphaNumeric) // [a-z]+
>>= (fun s -> if keyWordSet.Contains(s) then (preturn x) else fail "not a keyword")
let pContent =
pLineComment <|> pOperator <|> pNumeral <|> pKeyword <|> pIdentifier
上記のコードは、キーワードまたは識別子を2回解析します。または、修正するには、次のようにします。
- 単語全体(
[a-z][A-Z]+[a-z][A-Z][0-9]+
)を解析します。たとえば、すべて英数字です。
- それがキーワードまたは識別子(小文字で辞書に属している)であるかどうかを確認し、
- キーワードを返す
- 識別子を返す
PSロジックを台無しにしない場合は、最初に「安価な」パーサーを注文することを忘れないでください。