角かっこで囲まれた用語を検証するためのコマンドラインツール

角かっこで囲まれた用語を検証するためのコマンドラインツール

LaTeXのドキュメントに角かっこが正しいかどうかを自動的に確認するためのツールを探しています。

そのようなツールを書くのはとても簡単ですが、作成する前にすでに存在しているかどうかを知りたいです。

スクリプトで使用できるようにするには、コマンドラインツールまたはシェルコードである必要があります。 GUIツールは私には役に立ちません。括弧を確認する必要があります() {} [] <>

私は文書を角かっこ式として扱います。角かっこ以外のすべての文字は重要ではありません。角かっこ項 T が 1 種類の角かっこを持つには、次の条件を満たす必要があります。

  • Tの左右の角括弧の数は同じでなければなりません。
  • Tの接頭辞には、左括弧よりも右括弧を含めることはできません。

複数の種類の括弧(括弧セットB)がある場合、Tはすべてのβ∈Bに対して上記の条件を満たす必要があり、ペアの括弧から派生したTのすべての部分文字列も上記の条件を満たす必要があります。 Tの部分文字列(t_1、...、t_s)は、β型のペア括弧で導入されると見なされます。ただし、 (β_opening, t_1, ..., t_s, β_opening) は T の部分文字列です。

答え1

私は、チェッカーの言語によっては関係のない別の構文エラーでユーザーを悩ませることなく、括弧の正しいペアを調べるプログラムを知りません。

あなたが言ったように、このようなツールを書くのは簡単です。したがって、そのタスクを実行できる小さなスクリプトは次のとおりです。

#!/bin/sh

# If a file is given as 1st parameter, use it, else use stdin
[ "$#" -gt 0 ] && exec < "$1"

# A correct input file should result in an empty string
tr -d -c '{}[]()<>' |
sed '
    # Eliminate adjacent bracket pairs one by one
    :loop
    s/\[\]\|()\|{}\|<>//g
    t loop
' |
if grep -q .; then
    echo "ERROR: unpaired brackets!"
else
    echo "OK: all brackets are paired."
fi

sed実装が(非標準)代替演算子をサポートしていない場合は、このコマンドを4に置き換える\|ことができます。s

s/\[\]//g
s/{}//g
s/()//g
s/<>//g

上記のコマンドはtr標準ですが、一部(SysVベースのコマンド)はこれらのエスケープされていない[範囲について文句を言います。これを使用すると()エスケープを[使用できますが、POSIXでは指定されず、バックスペース文字を削除する方法があります。移植性のために、ASCIIベースのシステムでは。\tr -cd '{}()<>\[]'tr -cd '{}()<>\133\135'

答え2

grepPCREサポートでGNUを使用すると、次のことができます。

find . -size +0 -type f -exec \
  grep -zLP '\A((?:[^][<>{()}]++|<(?1)>|\{(?1)\}|\[(?1)\]|\((?1)\))*+)\z' {} +

そのようなファイルを見つけます(NULバイトが含まれておらず、各ファイルがメモリ全体に収まるほど小さいと仮定します)。

または直接呼び出しますperl(NULバイトのファイルは許可されています)。

find . -size +0 -type f -exec perl -l -0777 -ne 'print $ARGV unless
  /^((?:[^][<>{()}]++|<(?1)>|\{(?1)\}|\[(?1)\]|\((?1)\))*)$/' {} +

一部のPerl / PCRE固有の演算子:

  • \A\zトピックの始まりと終わりでそれぞれ一致します。^and $(またはオプションを含む)に似ています-xが、タイトルが複数行の場合はあいまいさはありません(一部のGNUバージョンでは必要ですgrep)。
  • ++AND演算子の非逆追跡バージョンです*+。これは、正規表現エンジンが一致を見つけることができないことを知っているときに一致を見つけるのに苦労しないようにするのに役立ちます。+*
  • (?1)そのキャプチャグループの正規表現を参照します。これは再帰的な正規表現を可能にします。
  • (?:...)、と同じです(...)が、グループ化にのみ使用されます(キャプチャしません...)

*.tex<TeXでは、/が>比較演算子として使用され、これらの文字の一部がコメント内で一致しないかエスケープされていることがわかったため、私のシステムは多くの割合のファイルを見つけました。

関連情報